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内部服务器错误)。
答案 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 file
或real 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
不支持QSA
或L
标记。那是RewriteRule
。