我的mod_rewrite代码出了问题。我希望重写基于3条规则发生:
到目前为止,我有前两个工作,但我似乎无法让第三个工作。这是我的代码:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php [QSA,L]
RewriteCond %{HTTP_HOST} ^fietsnl.nl
RewriteRule (.*) http://www.fietsnl.nl [R=301,L]
RewriteCond %{REQUEST_URI} ^page/([a-zA-Z_]+)$
RewriteRule ^page/([a-zA-Z_]+)$ /page/show/id/$1 [L]
如果我请求http://www.domain.com/page/pagename,它仍然会重新发布到第一条规则 你能否指引我改变什么?
谢谢!
答案 0 :(得分:1)
L in
RewriteRule (.*) index.php [QSA,L]
告诉mod_rewrite停止处理规则,以便在服务器上不存在该文件的情况下永远不会处理下面的两个。
我不是mod_rewrite的高手,但是通过在第一条规则之前移动最后一条规则它应该解决你的问题。
RewriteEngine on
RewriteCond %{REQUEST_URI} ^page/([a-zA-Z_]+)$
RewriteRule ^page/([a-zA-Z_]+)$ /page/show/id/$1 [L]
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php [QSA,L]
RewriteCond %{HTTP_HOST} ^fietsnl.nl
RewriteRule (.*) http://www.fietsnl.nl [R=301,L]
答案 1 :(得分:0)
规则按照它们出现的顺序进行匹配。
我认为page/pagename
不是现有文件或目录,因此它将匹配第一条规则,我将不会处理其他规则。
通常,您希望规则从最具体到最不具体排列,并且通常在重写之前进行重定向。
一个简单的解决方法是将第一条规则移到最后。