.htaccess - 重写url请求并处理css文件

时间:2014-03-19 00:43:28

标签: .htaccess mod-rewrite url-rewriting

关于使用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

它似乎有效,并且从正确的位置请求文件。

现在,问题:这是一个正确的方法吗?我可能会遇到安全问题吗?在程序员的世界里有没有更好的东西?

感谢您的支持。

1 个答案:

答案 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/" />