RewriteCond 检查目录是否存在索引文件

Pop*_*lus 6 regex apache .htaccess mod-rewrite

我正在尝试对所有请求进行重写,除非 URL 指向:

  • 现有文件
  • 带有索引文件的目录

所以我有以下应该处理它:

RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ redirect.php [QSA]
Run Code Online (Sandbox Code Playgroud)

但是,当我导航到包含 的文件夹时index.php(是的,我已检查DirectoryIndex设置为index.php),它仍然执行重写。

我还发现有趣的是,如果我.htaccess在那个文件夹中有一个RewriteEngine on(只是那个),那么上面的重写规则就起作用了......

任何指针?

Jon*_*Lin 5

您需要检查目录部分:

RewriteCond %{REQUEST_FILENAME}/index\.php !-f
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ redirect.php [QSA,L]
Run Code Online (Sandbox Code Playgroud)

还:

我还发现有趣的事情是,如果我在该文件夹中有一个 .htaccess 并启用了 RewriteEngine(仅此而已),那么上面的重写规则就起作用了……

这是因为子目录中的重写规则优先于父目录中的任何规则。所以如果你有一个RewriteEngine On没有规则的子目录,那么这意味着子目录优先于父目录中的重写规则并且没有规则。(有点混乱)。


anu*_*ava 5

在您的根 .htaccess 中尝试此规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1/index.php !-f
RewriteRule ^(.*?)/?$ redirect.php [L]
Run Code Online (Sandbox Code Playgroud)