2012-07-23 138 views
5

我有一个mod_rewrite条件/规则奇怪的问题。mod_rewrite不加载css和js文件

这是我正在使用的条件和规则。

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 

RewriteRule ^(.*)$ index.php?params=$1 [QSA,L] 

我的问题是,如果我访问www.example.com和www.example.com/page它加载罚款,但是当我尝试加载www.example.com/page/category它加载的页面,但不能找到CSS和JavaScript。它试图从page/css而不是/目录加载它们。

对我做错了什么想法?我对这里搜索,并尝试了一些事情,如添加

RewriteCond $1 !\.(js|ico|gif|jpg|png|css|html|swf|mp3|wav|txt)$ 

RewriteRule ^(images|css|javascript)(.*)$ index.php?params=$1 [QSA,L] 

但是,这似乎并没有太大的差别。

感谢您阅读

回答

2

的问题是,一个无声的重写不会告诉访问者的网络浏览器,他们实际上是在不同的目录路径寻找一个页面。

因此,对/页面的请求会使浏览器(正确)认为它正在查看位于Web服务器顶层公共目录中的资源,就像图像和CSS文件一样。

但是/ page/category的请求会让浏览器(错误地)认为它正在查看名为page的子目录中的资源。因此,当浏览器发送CSS和图像文件的请求时,它会要求服务器在/ page /子目录中查找它们,但这并不存在。因此,当浏览器尝试获取图像和CSS文件时,服务器返回404代码。

解决此问题的一种方法是将CSS,图像和其他页面引用资源的路径更改为绝对路径。用正斜杠启动它们,以便它们相对于实际的顶层公共目录进行锚定。如果您只有少量资源路径需要更新,这可能是继续进行的最佳方式。例如,更改:

src="image-name.png" 

src="/image-name.png" 

这将迫使浏览器中使用绝对路径,请求文件,而不是基于推断的相对路径的错误位置。

要删除需要进行的RewriteCond,您可以将您的重写规则更改为以下:

RewriteRule ^([a-z]+(?:/[a-z]+)*)$ index.php?params=$1 [QSA,L] 

这将不会匹配任何包含一个句点符号,所以对于图像和CSS文件的请求,将被跳过。

1

你有没有考虑过只使用base element,并删除图像之前的“/”?