对一些无私的超级htaccess精灵绅士的挑战:
我一直在为一个我正在研究的新网站的htaccess文件小心翼翼而且无法破解它。我让每个部分都独立工作 - 但是不能让他们全部合作。我正在基于PHP REQUEST_URI生成网站。多个域指向同一目录,因此它必须为多个域运行。我想要完成:
本质:
http://www.example.com/dog/cat - > 301表示为 - > http://example.com/dog/cat/ - >但默默地重定向到 - > http://example.com/script.php
OR
http://www.example.com/dog/cat/pig/bird/walrus - > 301表示为 - > http://example.com/dog/cat/pig/bird/walrus/ - >默默地重定向到 - > http://example.com/script.php
OR
http://www.example.com/dog/cat.html - > 301表示为 - > http://example.com/dog/cat/ - >默默地重定向到 - > http://example.com/script.php
OR
http://www.example.com/dog.php - > 301表示为 - > http://example.com/dog/ - >默默地重定向到http://example.com/script.php
到目前为止,我已经使用了以下片段(来自记忆,原谅我):
非WWW:
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 add trailing slash and force www with clean urls
非常感谢任何帮助!
更新
所以我继续摆弄.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 /
任何建议都意味着世界......
答案 0 :(得分:1)
您的条带尾随斜杠规则存在问题:
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文件中,它在vanilla apache安装上运行良好。