我有一个.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
的原因。
有谁能请解释这里发生的事情以及如何解决? 谢谢。
答案 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>