pun*_*ble 0 php apache .htaccess mod-rewrite redirect
我试图用最少的重定向来归档以下内容;
到目前为止我所拥有的并且正在工作:
RewriteEngine On
# REMOVE WWW
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
# FORCE HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# REMOVE TRAILING SLASH
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# REMOVE PHP EXTENSION
RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)/?$ /$1.php [END]
Run Code Online (Sandbox Code Playgroud)
当前行为:
http://www.example.com/functions.php -> https://example.com/functions
Run Code Online (Sandbox Code Playgroud)
(适用于 4 个重定向)
或者
http://www.example.com/functions/ -> https://example.com/functions
Run Code Online (Sandbox Code Playgroud)
(适用于 4 个重定向)
有没有人对如何以尽可能少的重定向进行这项工作有任何建议?
总是重写为 https 并一步丢失 www 并没有什么坏处。尾部斜杠没有改变,但在通过反转 Cond 来删除 php-extenstion 时丢失了一行。
# REMOVE WWW & FORCE HTTPS
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [OR]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# REMOVE TRAILING SLASH
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# REMOVE PHP EXTENSION if there's no file with this name
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301]
Run Code Online (Sandbox Code Playgroud)
如果您还需要处理被请求为file/without 的文件.php,您应该保留最后一部分的代码:
RewriteRule ^(.+)\.php$ /$1 [NC,L,R=301]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+)/?$ /$1.php [END]
Run Code Online (Sandbox Code Playgroud)