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

时间:2012-10-22 07:58:18

标签: php .htaccess mod-rewrite

对一些无私的超级htaccess精灵绅士的挑战:

我一直在为一个我正在研究的新网站的h​​taccess文件小心翼翼而且无法破解它。我让每个部分都独立工作 - 但是不能让他们全部合作。我正在基于PHP REQUEST_URI生成网站。多个域指向同一目录,因此它必须为多个域运行。我想要完成:

  1. 多个域指向同一目录,
  2. 强制非www,
  3. 强制拖尾斜杠没有扩展名,
  4. 将所有不存在的内容重定向到特定脚本
  5. 本质:

    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 /

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

1 个答案:

答案 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安装上运行良好。