.htaccess - 删除 www、强制 https、删除 php 并删除尾部斜杠

pun*_*ble 0 php apache .htaccess mod-rewrite redirect

我试图用最少的重定向来归档以下内容;

  • 删除 WWW
  • 强制 HTTPS
  • 删除php扩展
  • 删除结尾的斜杠

到目前为止我所拥有的并且正在工作:

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 个重定向)

有没有人对如何以尽可能少的重定向进行这项工作有任何建议?

Hel*_*shy 5

总是重写为 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)