如何让.htaccess重写规则适配含索引文件的目录请求?
修复.htaccess目录重定向异常问题
你的问题出在:当请求带尾斜杠的目录路径时,%{REQUEST_FILENAME}指向的是目录本身,而非目录内的index.html,所以规则中的-d(目录存在)条件会被触发,进而执行重定向;而请求具体文件路径时,%{REQUEST_FILENAME}指向实际文件,符合预期逻辑。
以下是简便的修复方案,通过新增规则排除“存在索引文件的目录”触发重定向的情况:
<IfModule mod_rewrite.c> RewriteEngine On # 若请求为存在的目录,且目录下有index.html,则跳过重定向 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}index.html -f RewriteRule ^ - [L] # 原有的重定向规则(按需调整,若你实际需求是仅重定向不存在的资源,需将条件改为!-f和!-d) RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d RewriteRule (.*)$ https://sub.example.com/$1 [R=301,L] </IfModule>
说明:
- 新增的两条
RewriteCond会先检查当前请求是否为存在的目录,同时该目录下是否有index.html文件。如果满足,RewriteRule ^ - [L]会直接终止后续规则执行,避免重定向。 - 如果你实际需求是仅重定向不存在的资源(即存在的文件/目录都留在当前域名),请将原有的重定向条件改为
!-f和!-d,修改后的规则如下:
<IfModule mod_rewrite.c> RewriteEngine On # 若请求为存在的目录,且目录下有index.html,则跳过重定向 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}index.html -f RewriteRule ^ - [L] # 仅当请求的文件或目录不存在时,执行重定向 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d RewriteRule (.*)$ https://sub.example.com/$1 [R=301,L] </IfModule>
内容的提问来源于stack exchange,提问作者Fexo
相关产品推荐
相关产品推荐

