.htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的hrefs仍然被不必要地重写[重复]

Posted

技术标签:

【中文标题】.htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的hrefs仍然被不必要地重写[重复]【英文标题】:.htaccess: using RewriteCond but hrefs to IMAGES/JS/CSS files still unwantedly rewritten [duplicate] 【发布时间】:2015-12-02 23:01:15 【问题描述】:

This post 概述了如何使用 RewriteCond 正确地提供图像、js 和 css 文件。但是,这是我的 .htaccess 文件(放置在服务器根目录下的目录中,该目录始终包含在网站的 http 链接中)(请注意,我的问题可能与 this other post 有关,但更具体):

RewriteEngine on

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu2=$3 [QSA,NC,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]

结果是 PHP 页面 index.php 始终服务良好(重写工作正常)。现在,我认为这些行:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

意味着,如果我们提供的不是 PHP 文件,那么就不要处理 RewriteRule 的文件或目录。我错了吗?为什么这两行不起作用?

我尝试在前面添加以下行:

RewriteCond %REQUEST_URI !\.(gif|jpg|png|ico|css|js)$ [QSA,NC,L]

但它不起作用(当我尝试检索根文档时,我收到 HTTP 500 内部服务器错误)。

【问题讨论】:

不就是对样式表和图片的相对资源引用吗?还是您的日志表明请求路径已被重写? 但是您正在提供一个 php 文件...它被称为 index.php 至少您的 .htaccess 代码显示的内容如此。有什么问题? 是的,我正在提供一个包含或引用其他所有内容的文件 index.php:PHP 文件引用了 /css/style.cs 和 js/jquery.js 文件,但这些文件正在被重写,而且我不明白前两个 RewriteCods 在我的 .htaccess 文件中做了什么以及我是否需要它们,因为到目前为止它们似乎没有任何区别。谢谢。 我认为您的问题尚未在 unix.stackexchange.com 上结束。 【参考方案1】:

您的问题是您只包含一次重写条件。重写条件仅适用于紧跟条件的RewriteRule。所以你需要每个RewriteRule 的条件。请注意以下区别。

RewriteEngine on

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu2=$3 [QSA,NC,L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]

现在如果你想保存一些代码行,或者你可以用这种方式编写你的 .htaccess 规则并通过在顶部添加规则来完成同样的事情,这样如果请求的文件是 real file 或 @987654326 @ 不做任何事情,否则继续下面的重写。

RewriteEngine on

RewriteCond %REQUEST_FILENAME -f [OR]
RewriteCond %REQUEST_FILENAME -d
RewriteRule ^.* - [L]

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2&menu3=$3 [QSA,NC,L]
RewriteRule ^([^/]+)/([^/]+)/?$ index.php?lang=$1&menu1=$2 [QSA,NC,L]
RewriteRule ^([^/]+)/?$ index.php?lang=$1 [QSA,NC,L]

另外,您在此行收到 500 错误的原因

RewriteCond %REQUEST_URI !\.(gif|jpg|png|ico|css|js)$ [QSA,NC,L]

是因为RewriteCond 不支持QSAL 标志。那是给RewriteRule

【讨论】:

感谢您的回答。那解决了它。出于好奇,您包含的第二个 sn-p 中的 RewriteRule 中的 [OR] 标志和 - (破折号)是做什么的?由于您发布的第一个 sn-p 实际上解决了我的问题,我想我不需要这样的代码,但也许您可以在您发布的第二个 sn-p 中解释一下这些代码的作用。 @JohnSonderson 请接受答案,因为它解决了您的问题。现在OR 标志就是这样。这意味着如果第一个条件匹配 OR 第二个条件匹配然后执行以下重写。破折号表示规则什么也不做。所以它基本上就停在那里。第二个 sn-p 代码较少,我的偏好是,但如果您正在学习 mod_rewrite,第一个可能更容易理解。 谢谢。我现在明白了破折号。但是 [OR],无论如何,[OR] 都不成立。毕竟,通用文件要么是文件要么是目录(不能同时是两者)。这让我感到困惑。如果没有 OR,这两个指令肯定不能进行与运算。一旦我理解了这个问题,我会接受。 @JohnSonderson 接受并没有真正通过完全了解某事的工作原理来完成答案。我修复了您遇到问题的代码。 :) 没有真正了解 OR 的工作原理并不完全在范围内,因为那将成为一种培训情况。请查看documentation 向下滚动到底部#6,它给出了很好的解释,希望它更清楚。

以上是关于.htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的hrefs仍然被不必要地重写[重复]的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess rewritecond/rule 并隐藏 url 参数

mod_rewrite RewriteCond 基于 Last-modified? (.htaccess)

错误 500:.htaccess RewriteCond:错误的标志分隔符

.htaccess:用params将rewriteCond改为同一URL内的另一个页面

.htaccess移动设备重定向

使用 htaccess 强制下载图片