2

对一些无私的超级 htaccess 巫师绅士的挑战:

我一直在为我正在开发的一个新站点删除一个 htaccess 文件,但无法破解它。我让每个部分独立工作 - 但不能让他们一起工作。我正在基于 PHP REQUEST_URI 生成站点。多个域指向同一个目录,因此它必须适用于多个域。我正在努力完成:

  1. 多个域指向同一个目录,
  2. 强制非 www,
  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

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

非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 添加斜杠并使用干净的网址强制 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/

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

4

1 回答 1

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,这些规则都不应该相互冲突。它在我的 vanilla apache 安装上的空白 htaccess 文件中运行良好。

于 2012-10-22T08:55:24.933 回答