我想让我所有的 URL 统一干净。这意味着我所有的 URL 都没有扩展名,也没有斜杠,如果有人输入了.php
斜杠或斜杠,它只会将该人重定向到干净的 URL。
例子:
example.com/blog/file.php
和
example.com/blog/file/
都会重定向到
example.com/blog/file
我想让我所有的 URL 统一干净。这意味着我所有的 URL 都没有扩展名,也没有斜杠,如果有人输入了.php
斜杠或斜杠,它只会将该人重定向到干净的 URL。
例子:
example.com/blog/file.php
和
example.com/blog/file/
都会重定向到
example.com/blog/file
试试.htaccess
这个:
RewriteEngine on
#unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
#resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
#redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php /$1 [R=301,L]
我的虚拟主机最近(2011 年 9 月)将他们的 Apache 服务器更新为更新版本的 Apache,而我.htaccess
用于显示无扩展 URL 的旧代码不再有效。在大量复制代码(可能适用于旧版本的 Apache 操作系统)和不成功的测试之后,我能够确定以下代码似乎可以在我的服务器和其他几个服务器上运行:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.#?\ ]+\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php http://www.example.com/$1 [R=301,L]
试一试——这-Multiviews
似乎是让它发挥作用的关键因素。
# Turn off the need of directory slash redirecting
DirectorySlash Off
# Turn on RewriteEngine
RewriteEngine On
# Internally redirect request to php file
RewriteCond "%{REQUEST_FILENAME}" !-f
RewriteCond "%{REQUEST_FILENAME}\.php" -f
RewriteRule "(.*)" "$1.php" [L]
# External redirects
# The above line is used to determine whether a internal redirect is done or not.
# If it is internally redirected, REDIRECT_STATUS will become 200.
# RewriteCond "%{ENV:REDIRECT_STATUS}" "^$"
# Redirect request with .php extension to extensionless
RewriteCond "%{ENV:REDIRECT_STATUS}" "^$"
RewriteRule "(.*)\.php$" "$1" [R=301]
# Redirect request with trailing slash to slashless
RewriteCond "%{ENV:REDIRECT_STATUS}" "^$"
RewriteCond "%{REQUSET_FILENAME} -d
RewriteCond "%{REQUSET_FILENAME} !-f
RewriteRule "(.*)\/" "$1" [R=301]