Apache 为什么这些修改规则不起作用?
我有一个Apache 为什么这些修改规则不起作用?,apache,.htaccess,mod-rewrite,redirect,infinite-loop,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?cm
.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>
重新启动发动机
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_FILENAME}-F
重写规则^(.+?)/(\d+?)/?$index.php?cmd=$1&num=$2[L]
重写规则^(+?)/?$index.php?cmd=$1[L]
基本上,我正在尝试编写一个API来处理请求,比如get\u all/
或get/123/
问题是,当我尝试转到上述任一URL时,cmd
参数总是设置为index.php
,而num
参数根本没有设置
如果我注释掉了RewriteRule
行中的任何一行,那么请求处理剩余的未注释掉的RewriteRule,但我需要能够处理这两种情况
我知道mod_rewrite
会出现循环,但在这种情况下,我不知道如何停止循环。我甚至无法理解为什么上面的规则会导致cmd
被设置为index.php
有人能解释一下这里发生了什么以及如何解决吗?谢谢。规则正在运行,因为
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>
如果您在子文件夹中并使用子域,可能只需在“RewriteEngine On”下添加“RewriteBase/”?再次,您节省了时间!非常感谢你。我知道为什么第一个可以工作,但是第二个中的
重写规则^-[L]
如何工作?重写规则^-[L]
意味着如果上述条件有效,则什么也不做,即文件或目录检查。anubhava,再次感谢您的帮助和解释。不幸的是,第二个解决方案(没有重复的RewriteCond
行的解决方案)不起作用。有什么线索吗?谢谢。第一个很好用,但是当我将第二个复制并粘贴到我的.htaccess
文件中时,它就不起作用了。我现在无法测试它,但我会在稍后注意到错误(我相信它是404)。很抱歉造成混淆。它确实奏效了。我第一次一定没有正确地复制和粘贴它,因为它以前不起作用,但现在起作用了。不知道为什么,但现在效果很好。再次感谢。
<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>