一些利他主义的超级巫师绅士的挑战:
我一直在为我正在开发的新网站削减一个htaccess文件,但无法破解它。 我让每个部分独立工作 - 但无法让它们一起工作。 我正在根据 PHP REQUEST_URI生成网站。 多个域指向同一目录,因此它必须对多个域起作用。 我正在尝试完成:
- 多个域指向同一目录,
- 强制非万维网,
- 强制尾随斜杠而不扩展,以及
- 将所有不存在的内容重定向到特定脚本
本质上:
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 文件中工作正常。