.htaccess,多个域,非www,强制尾随斜杠,全部重定向到PHP脚本



一些利他主义的超级巫师绅士的挑战:

我一直在为我正在开发的新网站削减一个htaccess文件,但无法破解它。 我让每个部分独立工作 - 但无法让它们一起工作。 我正在根据 PHP REQUEST_URI生成网站。 多个域指向同一目录,因此它必须对多个域起作用。 我正在尝试完成:

  1. 多个域指向同一目录,
  2. 强制非万维网,
  3. 强制尾随斜杠而不扩展,以及
  4. 将所有不存在的内容重定向到特定脚本

本质上:

http://www.example.com/dog/cat -> 301 显示为 -> http://example.com/dog/cat/->但静默重定向到 -> http://example.com/script.php

http://www.example.com/dog/cat/pig/bird/walrus -> 301 显示为 -> http://example.com/dog/cat/pig/bird/walrus/->静默重定向到 -> http://example.com/script.php

http://www.example.com/dog/cat.html -> 301 显示为 -> http://example.com/dog/cat/->静默重定向到 -> http://example.com/script.php

http://www.example.com/dog.php -> 301 显示为 -> http://example.com/dog/->静默重定向到 http://example.com/script.php

到目前为止,我已经使用了以下片段(从记忆中,请原谅我):

非万维网:

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

条形尾部斜杠:

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301]

脚本全部不存在:

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^.*/$ ./script.php [L]

我遇到了特定部件根本无法运行、递归效果等问题。 我不喜欢寻求帮助,我已经尽力做功课,但我就是想不通这个。

我在这里发现了类似的问题,例如:

htaccess 添加尾部斜杠并使用干净的 URL 强制 www

任何帮助将不胜感激!

更新:

所以我继续摆弄 .htaccess 文件。 我在问题下方添加了一条评论,大意是我在使用 Firefox 的"精彩"地址栏搜索功能时遇到问题,该功能在域非 www 和非尾部斜杠时重定向域名进行搜索。 因此,我更改了我的方案以保持一致(防止重复),但做了相反的事情:强制 www 和尾部斜杠。

以下代码生成的结果接近我正在寻找的结果:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
#Redirect Forcing trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .*[^/]$ /$0/ [L,R=301]
#Redirect non-www to www
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
#Redirect to script
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ script.php [L]

我仍然需要删除不存在的文件的扩展名,即:

www.example.com/cats.html -> www.example.com/cats/

任何建议都意味着世界...

您的条带尾斜杠规则有问题:

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [L,R=301]

您再次匹配相同的尾部斜杠,并在重定向中添加另一个斜杠。您的目标需要更改为:

RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1 [L,R=301]

这肯定会导致重定向循环。否则,唯一可能成为问题的其他问题是使用%{SCRIPT_FILENAME}而不是%{REQUEST_FILENAME}.在大多数情况下,它应该没有什么区别,但第二个可能是你真正想要的:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*/$ ./script.php [L]

只要 2 个重定向规则位于路由到script.php规则之前,这些规则就不应相互冲突。它在原版阿帕奇安装上的空白 htaccess 文件中工作正常。

最新更新