apache - mod_rewrite 不加载 css 和 js 文件

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

对我做错了什么有任何想法吗?我在这里进行了搜索并尝试了一些方法,例如添加
RewriteCond $1 !\.(js|ico|gif|jpg|png|css|html|swf|mp3|wav|txt)$ 


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

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

谢谢阅读

最佳答案

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

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

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

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

src="image-name.png"

进入
src="/image-name.png"

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

要消除对 RewriteCond 的需求,您可以将 RewriteRule 更改为以下内容:
RewriteRule ^([a-z]+(?:/[a-z]+)*)$ index.php?params=$1 [QSA,L]

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

关于apache - mod_rewrite 不加载 css 和 js 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11611084/

相关文章:

.htaccess - 带参数的 htaccess 重定向?

javascript - 使用 JQuery 从 Flask 获取 JSON 有时返回 null

Apache Bench - 请求失败

php - 将 url 重写为干净的 url

php - XAMPP .htaccess mod_rewrite 不工作

apache - 301 将非 www 重定向到 www

php - 如何平衡网络服务器带宽使用?

python - 在 Apache - CentOS 上运行 Flask

php - 找不到 Prestashop 1.7 模块目录数据

apache - 使用目录创建用户友好的 URL