我有一个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
答案 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的每目录继承还有其他注意事项。
好的,好的。 (那些指令在其他方面相当“不寻常”!)但是,301重定向旨在“修复”请求。通过内部重写请求,您现在可能存在重复内容问题。由于我不希望Apache在对目录的请求没有以斜线结尾时发送301。