Mod rewrite 修改不需要第三条规则

Mod rewrite 修改不需要第三条规则,mod-rewrite,apache2,Mod Rewrite,Apache2,我的mod_重写代码有问题。我希望重写基于3条规则: 如果它不是已知文件(图像、xml),请重新路由到index.php(对于Zend MVC) 如果域名前没有www,请添加它 如果请求的url为www.domain.com/page/pagename,请重写为www.domain.com/page/show/id/pagename 到目前为止,我已经让前两个工作,但我似乎无法让第三个工作。这是我的代码: RewriteEngine on RewriteCond %{SCRIPT_FILENA

我的mod_重写代码有问题。我希望重写基于3条规则:

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

    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] 
    
    如果我请求,它仍然会重新指向第一条规则 你能告诉我该改变什么吗


    谢谢

    规则按其出现的顺序匹配

    我假设
    page/pagename
    不是现有的文件或目录,因此它将匹配第一条规则,并且不会处理任何其他规则

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

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

    中的L

    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]
    

    啊,谢谢你的解释。不过,我还是没有得到不得不去的结果。还有什么我搞砸了吗?我不是100%确定为什么(就像我说的我不是专家),但似乎
    RewriteCond%{REQUEST\u URI}^page/([a-zA-Z]+)$
    有问题。如果我去掉它,它在我的服务器上会像预期的那样工作。因此,
    %{REQUEST_URI}^/page/([a-zA-Z!+)$
    应该可以工作。啊,它似乎路由正确,只有Zend MVC似乎接受原始值。谢谢你的帮助!