Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 为什么这些修改规则不起作用?_Apache_.htaccess_Mod Rewrite_Redirect_Infinite Loop - Fatal编程技术网

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>