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 内部服务器错误)。
最佳答案
您的问题是您只包含重写条件一次。重写条件仅适用于紧随其后的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 规则,并通过在顶部添加规则来完成相同的操作,这样如果请求的文件是真实文件
或 真实目录
不执行任何操作,否则继续进行下面的重写。
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
不支持QSA
或L
标志。这是针对 RewriteRule
的。
关于javascript - .htaccess:使用 RewriteCond 但对 IMAGES/JS/CSS 文件的 href 仍然被不必要地重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32437817/