.htaccess:使用RewriteCond,但对IMAGES/JS/CSS文件的hrefs仍被意外重写


.htaccess: using RewriteCond but hrefs to IMAGES/JS/CSS files still unwantedly rewritten

这篇文章概述了如何使用RewriteCond正确地提供图像、js和css文件。然而,这是我的.htaccess文件(放在服务器根目录下的一个目录中,该目录总是包含在网站的http链接中((注意,我的问题可能与另一篇文章有关,但实际上更具体(:

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]

但它不起作用(当我试图检索根文档时,我得到了一个HTTP500内部服务器错误(。

您的问题是只包含一次重写条件。重写条件仅适用于紧跟在条件之后的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 filereal directory,就什么都不做了,否则就继续下面的重写。

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]

同样是fyi,你在这条线上得到500错误的原因

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

是因为CCD_ 5不支持CCD_ 6或CCD_。这是针对RewriteRule的。