non-www 重定向和尾部斜线的 htaccess 问题

htaccess issue with non-www redirect and trailing slash

我目前将所有流量重定向到我网站的 www. 版本。但是,在检查特定文件夹中的重定向链接时,我注意到一些可能/可能不是问题的东西。

基本上,如果我在 www.example.com/example/examplepage/ 上进行 header 检查,它会显示 200 OK。

如果我检查 www.example.com/example/examplepage(没有尾随 /),它会按原样显示 301 重定向到上面。

但是,如果我检查 example.com/example/examplepage/(没有 www),它会重定向到 www.example.com/example/examplepage.php ... 然后重定向到 www.example.com/example/examplepage/(正确的页面)。

我希望这是有道理的?

a) 这样可以吗?
b) 我是否在 .htaccess 中遗漏了什么?

  RewriteOptions inherit
RewriteEngine On

RewriteCond %{THE_REQUEST} ^.*/index.htm
RewriteRule ^(.*)index.htm$ http://www.example.com/ [R=301,L]

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) http://www.example.com/ [R=301,L]


RewriteCond %{THE_REQUEST} \.php
RewriteRule ^tips/([^.]+)\.php$ http://www.example.com/example// [R=301,L]

RewriteRule ^tips/([^.]+[^./])$ http://www.example.com/example// [R=301,L] 

RewriteRule ^(tips/[^.]+)/$ /.php [L] 

请注意:上面的 PHP 规则是为特定文件夹的 "hide" .php 扩展创建的(不希望它们隐藏在其他任何地方)。

我设法解决了(好吧,好吧 - 幸运的猜测),但不管怎样,它现在似乎可以工作了。我调整了上面的规则顺序以显示以下内容:

RewriteEngine On
RewriteCond %{THE_REQUEST} \.php
RewriteRule ^tips/([^.]+)\.php$ http://www.example.com/tips// [R=301,L]
RewriteRule ^tips/([^.]+[^./])$ http://www.example.com/tips// [R=301,L] 
RewriteCond %{THE_REQUEST} ^.*/index.htm
RewriteRule ^(.*)index.htm$ http://www.example.com/ [R=301,L]

RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule (.*) http://www.example.com/ [R=301,L]

RewriteRule ^(tips/[^.]+)/$ /.php [L] 

这现在导致:

  1. http://example.com/tips/examplepage.php(和 www 版本)
  2. http://example.com/tips/examplepage - 没有尾部斜杠(和 www 版本)

所有最终重定向到 www.example.com/tips/examplepage/(带尾部斜杠)

它还确保 www.example.com/examplepage.php(不在 "tips" 文件夹中)保持其扩展名。

它还会将 index.htm 重写为 /(同时使用 www 和非 www)。

我已尝试在此处添加尽可能多的细节,希望它能防止其他人浪费整个周末的时间拔头发、变白等...