htaccess在URL上使用尾部斜杠的不同行为

时间:2013-06-30 18:58:55

标签: apache .htaccess mod-rewrite

我在.htaccess文件放置在根文件夹

中有以下规则
RewriteEngine on

RewriteRule ^/?$ /testsite/index.php?rel=m
RewriteRule ^about/?$ /testsite/aboutus.php?rel=b
RewriteRule ^ict/?$ /testsite/ict.php?rel=b
RewriteRule ^eeap/?$ /testsite/eeap.php?rel=b

索引规则可以正常工作,有或没有尾部斜杠。但是当我点击 http://mydomain.com/testsite/about/ 时,页面会在没有CSS和图片的情况下提供,如果删除了最后一个斜杠,则工作正常。这也适用于 ict 的规则。

对于下一个规则( eeap ),事情的行为方式相反。如果我用斜杠结束URL,CSS和图像就会丢失。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要从Web浏览器的角度考虑这一点。

如果URL没有以斜杠结尾,例如“/ about”,则Web浏览器会假定它正在Web服务器的顶级目录中查看名为“about”的文件。因此,由“/ about”生成的具有相对路径的页面中的任何请求都将导致Web浏览器基于在顶级目录中启动而生成完整路径。例如,CSS文件路径“css / style.css”将导致浏览器从顶层启动并从“/css/style.css”请求文件。

但是如果URL在我们的示例中以斜杠结尾处于“/ about /”,那么Web浏览器认为它正在查看名为“about”的子目录。现在,相同的CSS文件路径“css / style.css”将导致Web浏览器从“/about/css/style.css”请求文件。

一个CSS文件路径是正确的,另一个不会。因此,你所看到的行为。

有几种方法可以避免这种情况。您可以告诉Apache将所有请求永久重定向到以斜杠结尾的URL或不包含斜杠的URL,以便所有访问者最终都会查看相同的URL。这样就可以知道在网页中使用哪些相对的CSS和图像路径。

或者您可以修改您的网页,以便CSS,图像,JavaScript等的所有文件路径都锚定到顶级目录。所以“css / style.css”会变成“/css/style.css”(请注意路径开头的正斜杠,告诉浏览器从顶级目录开始)。

或者您可以添加一堆复杂的mod_rewrite规则来尝试捕获CSS文件等的所有可能结果。我不赞成这种方法,因为它通常会使你的规则集更加脆弱和复杂。