Apache 为什么.htaccess重写规则在根路径/中不起作用,而在所有其他文件和子目录中起作用?

Apache 为什么.htaccess重写规则在根路径/中不起作用,而在所有其他文件和子目录中起作用?,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在使用并用以下代码替换原始的.htaccess文件,以测试重定向所有请求: DirectoryIndex index.php index.html Options +FollowSymLinks -MultiViews -Indexes <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule . /foo\.php [L,R=307] </IfModule> DirectoryIndex

我正在使用并用以下代码替换原始的.htaccess文件,以测试重定向所有请求:

DirectoryIndex index.php index.html
Options +FollowSymLinks -MultiViews -Indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule . /foo\.php [L,R=307]
</IfModule>
DirectoryIndex.php index.html
选项+后续符号链接-多视图-索引
重新启动发动机
重写基/
重写规则/foo\.php[L,R=307]
每个访问都被重定向,但根目录除外,我按如下方式打开了它:

(随机字符以避免重定向缓存)

.htaccess位于根目录中:

以下URL也被重定向:


因此,这仅对“/”路径有效。原因可能是什么?

实际上,重定向规则有两个问题:

  • 它不会重定向登录页(正如您所发现的)
  • 将导致重定向循环,因为
    /foo.php
    也将被重定向到
    /foo.php
    ,并且没有条件停止该重定向
  • 您可以使用此重定向规则来处理这两个问题:

    重新编写引擎打开
    重写规则^foo\.php$/foo.php[NC,L,R=307]
    

    ^如果URI已经是
    /foo.php

    /
    或者htaccess所在的目录被视为空URI,则foo\.php$
    为否定条件以避免重定向。您需要使用
    ^$
    来匹配根目录。在您的情况下,如果您在模式中使用
    *
    而不是
    ,或者使用
    ^
    而不是
    来匹配所有内容(包括空)将测试并返回反馈。否定在我的最终代码中不起作用,但是
    RewriteCond%{REQUEST\u URI}^/foo\.php$RewriteRule.*/foo\.php[L,R=307]
    有效。