mod_rewrite不会采取第三条规则

时间:2012-02-14 15:02:02

标签: mod-rewrite apache2

我的mod_rewrite代码出了问题。我希望重写基于3条规则发生:

  1. 如果它不是已知文件(images,xml),请重新路由到index.php(对于Zend MVC)
  2. 如果域名前没有www,请添加
  3. 如果请求的网址是www.domain.com/page/pagename,请重写为www.domain.com/page/show/id/pagename
  4. 到目前为止,我有前两个工作,但我似乎无法让第三个工作。这是我的代码:

    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,它仍然会重新发布到第一条规则 你能否指引我改变什么?

    谢谢!

2 个答案:

答案 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不是现有文件或目录,因此它将匹配第一条规则,我将不会处理其他规则。

通常,您希望规则从最具体到最不具体排列,并且通常在重写之前进行重定向。

一个简单的解决方法是将第一条规则移到最后。