为什么这些mod_rewrite规则不起作用?

时间:2014-12-30 02:39:46

标签: apache .htaccess mod-rewrite redirect infinite-loop

我有一个.htaccess文件,如下所示:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]
  RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>

基本上,我尝试编写可以处理get_all/get/123/等请求的API。

问题是,当我尝试转到上述任一网址时,cmd参数始终设置为index.php,而num参数根本未设置。< / p>

如果我注释掉RewriteRule行中的任何一行,那么请求将用于剩余的,未注释的RewriteRule,但我需要能够处理这两种情况。

我知道mod_rewrite发生的循环,但在这种情况下,我不知道如何阻止它。我甚至无法理解上述规则导致cmd设置为index.php的原因。

有谁能请解释这里发生的事情以及如何解决? 谢谢。

1 个答案:

答案 0 :(得分:1)

规则的行为是因为RewriteCond仅适用于下一个RewriteRule。因此,您的上一个RewriteRule无条件运行,因此mod_rewrite循环运行两次。

使用此代码进行修复:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>

如果您想避免重复Rewriteond,请使用:

<IfModule mod_rewrite.c>
  RewriteEngine On

  # skips files and directories from rewrite rules
  RewriteCond %{REQUEST_FILENAME} -d [OR]
  RewriteCond %{REQUEST_FILENAME} -f
  RewriteRule ^ - [L]

  RewriteRule ^(.+?)/(\d+?)/?$ index.php?cmd=$1&num=$2 [L]

  RewriteRule ^(.+?)/?$ index.php?cmd=$1 [L]
</IfModule>