关于使用htaccess重写uri的一个小问题,并且还要注意浏览器对包含文件(如.css文件)的请求是"错误"。
首先,背景:我在服务器上有这个文件结构:
/mysite/.htaccess
/mysite/articles.php
/mysite/includes/css-files/layout.css
并进入articles.php
我有行
<style type="text/css">
@import url(./includes/css-files/layout.css);
</style>
当我直接请求php文件时,一切都应该运行良好。但是,由于我们不想直接请求它,但是使用重写规则来使url user / ceo-friendly,我们遇到了相对路径的问题。因此,例如,将这些行放入.htaccess文件
# take care of different requests
RewriteRule ^articles/writer/(\w*)/?$ articles.php?writer=$1
RewriteRule ^articles/tag/(\w*)/?$ articles.php?tag=$1
当用户转到mysite/articles/writer/erenor
时,服务器会将请求重定向到mysite/articles.php?writer=erenor
。这很好。然后,浏览器尝试请求css文件,但请求将如下:
GET mysite/articles/writer/includes/css-files/layout.css
这并不好。所以,我试图添加这样的规则:
# take care of adapting "base url" for css files
RewriteRule /(\w*)\.css includes/css-files/$1.css
它似乎有效,并且从正确的位置请求文件。
现在,问题:这是一个正确的方法吗?我可能会遇到安全问题吗?在程序员的世界里有没有更好的东西?
感谢您的支持。
答案 0 :(得分:1)
这种方法可能不太理想,因为您现在有2个指向同一资源的URL。您可以做的是重定向而不是重写:
RewriteRule /(\w*)\.css includes/css-files/$1.css [L,R=301]
但问题的根源是:
@import url(./includes/css-files/layout.css);
.
前面有一个/includes
,它使它成为一个相对URL,浏览器必须确定在请求layout.css时要使用的URI库。据他所知,它所请求的资源是/mysite/articles/writer/erenor
,所以很明显它假定基数为/mysite/articles/writer/
。它对你的重写没有任何了解,它正在以正确的方式做事。要避免这种情况,请将您的网址更改为绝对网址:
@import url(/mysite/includes/css-files/layout.css);
或将正确的相对URI基础添加到页面的标题中:
<base href="/mysite/" />