mod_rewrite没有加载css和js文件

时间:2012-07-23 10:51:43

标签: apache mod-rewrite

我对mod_rewrite条件/规则有一个奇怪的问题。

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

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而不是/ directory加载它们。

对我做错了什么的任何想法?我在这里搜索并尝试了一些添加

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

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

但这似乎并没有多大区别。

感谢您阅读

2 个答案:

答案 0 :(得分:2)

问题在于,静默重写不会告诉访问者的Web浏览器他们实际上正在查看来自不同目录路径的页面。

因此,对/ page的请求会使浏览器(正确地)认为它正在查看Web服务器顶层公共目录中的资源,图像和CSS文件也是如此。

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

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

src="image-name.png"

src="/image-name.png"

这会强制浏览器使用绝对路径请求文件,而不是根据相对路径推断出错误的位置。

要删除RewriteCond,您可以将RewriteRule更改为以下内容:

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

这与包含句点(点)符号的任何内容都不匹配,因此将跳过对图像和CSS文件的请求。

答案 1 :(得分:1)

您是否考虑过使用base element,并在图片前删除“/”?