嵌套.htaccess中的mod_rewrites导致奇怪的404

时间:2016-09-09 01:04:27

标签: apache mod-rewrite

我有一个apache HTTP服务器,其目录结构如下:

/
---- api/
---- ---- index.php
---- ---- .htaccess
---- index.php
---- .htaccess

/ htaccess的

DirectorySlash Off
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ $1/

/api/.htaccess

RewriteEngine On

我的目标是在没有尾随反斜杠的情况下显示目录的index.php。但是,调用http://example.com/api会产生404.在/api/.htaccess中排除一行会导致所有内容按预期工作。

我很难理解这种行为,因为RewriteEngine On /filpath1/file.bam /filespath2/file2.bam /filepath3/file3.bam 对此一无所知。有人可以对mod_rewrite的工作有所了解吗?

目录,压缩:doc

1 个答案:

答案 0 :(得分:1)

  

在/api/.htaccess中排除一行会导致一切按预期工作。

是的,因为在每个目录的上下文中,默认情况下不会继承mod_rewrite指令(这与其他模块不同)。通过在子目录中启用mod_rewrite引擎,您覆盖父目录中的mod_rewrite指令 - 并且父目录中的这些指令需要使http://example.com/api请求按预期工作。

请注意,DirectorySlash指令是mod_dir的一部分,因此不会覆盖它。因此DirectorySlash仍为Off。这导致Apache尝试提供目录 /api,但失败了。 (虽然我原本预计会产生403而不是404?)

默认情况下,文档根目录中.htaccess文件中的mod_rewrite指令适用于所有子目录,因此不需要在此处执行任何特殊操作。

如果你想从父.htaccess文件继承 mod_rewrite指令,那么你需要查看RewriteOptions directive - 但是mod_rewrite的每目录继承还有其他注意事项。

  

由于我不希望Apache在对目录的请求没有以斜线结尾时发送301。

好的,好的。 (那些指令在其他方面相当“不寻常”!)但是,301重定向旨在“修复”请求。通过内部重写请求,您现在可能存在重复内容问题。