.htaccess:使用RewriteCond但hrefs仍然不需要重写IMAGES / JS / CSS文件

时间:2015-09-07 11:40:24

标签: javascript php css .htaccess mod-rewrite

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内部服务器错误)。

1 个答案:

答案 0 :(得分:2)

您的问题是您只包含一次重写条件。重写条件仅适用于紧随条件的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]

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