mod_rewrite没有加载css和js文件

hoo*_*gan 5 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]
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我访问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)$ 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢阅读

Bob*_*ous 2

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

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

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

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

src="image-name.png"
Run Code Online (Sandbox Code Playgroud)

进入

src="/image-name.png"
Run Code Online (Sandbox Code Playgroud)

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

要消除对 RewriteCond 的需要,您可以将 RewriteRule 更改为以下内容:

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

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