为什么 .htaccess RewriteRule 在根路径中不起作用,但对所有其他文件和子目录起作用?

Why does .htaccess RewriteRule not work in root path / but with for all other files and subdirs?

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

DirectoryIndex index.php index.html
Options +FollowSymLinks -MultiViews -Indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule . /foo\.php [L,R=307]
</IfModule>

所有访问都被重定向,除了根,我打开如下:

http://192.168.178.9:8666/?randomchars(随机字符以避免重定向缓存)

.htaccess 在根目录中:

以下 URL 也被重定向:

http://192.168.178.9:8666/index.php?randomchars

所以这只对“/”路径有效。可能是什么原因?

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

  1. 它不会重定向着陆页(如您所知)
  2. 将导致重定向循环,因为 /foo.php 也将被重定向到 /foo.php,并且没有条件停止该重定向。

您可以使用此重定向规则来处理这两个问题:

RewriteEngine On

RewriteRule !^foo\.php$ /foo.php [NC,L,R=307]
如果 URI 已经是 /foo.php.

!^foo\.php$ 是避免重定向的否定条件