5

我对 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 而不是 / 目录加载它们。

对我做错了什么有任何想法吗?我在这里进行了搜索并尝试了一些方法,例如添加

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

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

但这似乎并没有太大的区别。

谢谢阅读

4

2 回答 2

2

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

因此,对 /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 文件的请求。

于 2013-03-24T20:53:55.737 回答
1

您是否考虑过仅使用base元素,并删除图像前的“/”?

于 2013-07-30T20:32:13.687 回答