.htaccess无法重写/doc目录下已存在HTML文件问题求助
问题排查结论
导致规则异常的核心原因如下:
- 规则作用域缺失:你自定义的
/doc/路径重写规则未包裹在<IfModule mod_rewrite.c>块内,部分服务器配置下该类外部规则不会被mod_rewrite模块加载执行 - 规则优先级错误:自定义规则放在了WordPress自动生成规则块的末尾,Apache处理静态文件时会优先匹配目录索引规则,真实存在的
.html文件请求会被直接返回,绕过后续的重写规则 - 内容协商冲突:若服务器开启了
mod_negotiation的MultiViews配置,Apache会自动匹配对应后缀的静态文件直接返回,完全跳过重写规则校验
修复方案
将自定义重写规则放在整个.htaccess文件的最顶部(# BEGIN WordPress标记之前),修改后的完整配置结构如下:
# 自定义规则放最前面 <IfModule mod_rewrite.c> RewriteEngine On # 关闭MultiViews避免内容协商绕过重写 Options -MultiViews # 匹配/doc/下所有存在的文件、目录请求 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^doc/(.*)$ /dl-file.php?file=$1 [QSA,L] # 原webmail跳转规则移到这里 RewriteCond %{HTTP_HOST} ^mywebsite\.com$ [OR] RewriteCond %{HTTP_HOST} ^www\.mywebsite\.com$ RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteRule ^webmail$ "https\:\/\/mywebsite\.mywebsite\.com\:2096\/" [R=301,L] </IfModule> # BEGIN WordPress # 保留WordPress自动生成的原有规则不变,不要修改该块内的内容 # Le direttive (linee) tra `BEGIN WordPress` e `END WordPress` sono # generate dinamicamente, e dovrebbero essere modificate solo tramite i filtri di WordPress. # Ogni modifica alle direttive tra questi marcatori verrà sovrascritta. <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_URI} !/(wp-content/uploads/.*)$ RewriteCond %{REQUEST_URI} !/(doc/.*)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
注意事项
- 不要修改
BEGIN WordPress和END WordPress之间的内容,WordPress后台更新固定链接时会覆盖该块内的自定义内容 - 若你不需要限制目录访问,仅需要限制文件访问,可以去掉规则中的
[OR] RewriteCond %{REQUEST_FILENAME} -d部分,仅保留文件匹配逻辑
内容的提问来源于stack exchange,提问作者Xriuk
相关产品推荐
相关产品推荐

