.htaccess代码无法清理缓存、隐藏HTML后缀,请问哪里存在错误?
.htaccess 规则错误点及修复方案
缓存清理功能失效原因
- Expires头赋值格式不符合Apache规范,直接填写
0属于无效值,浏览器会直接忽略该响应头,无法触发过期清理。 - Header指令仅使用
set参数,仅对200系列正常响应生效,304缓存命中、4xx/5xx异常响应不会携带缓存头,导致部分场景缓存规则不生效。 - 未限制缓存规则作用范围,全局配置很容易被服务器上层站点配置覆盖。
HTML后缀隐藏功能失效原因
- 正则规则
^([^\.]+)$会拦截所有带点的路径,若站点存在含点的多级目录、带参数的路径都会直接匹配失败,无法触发重写。 - 仅判断了请求路径不是文件,但未校验对应的
.html文件是否真实存在,重写后如果文件不存在会直接返回500内部错误。 - 未关闭Apache的
MultiViews内容协商功能,开启状态下服务器会自动匹配文件后缀,会优先返回带后缀的响应,和重写规则冲突。 - 没有添加带后缀访问的跳转规则,用户直接访问带
.html后缀的地址时不会自动跳转到无后缀路径,达不到隐藏效果。
修正后的完整配置
Options -Indexes +ExecCGI -MultiViews AddHandler cgi-script .cgi .pl <IfModule mod_headers.c> Header always set Cache-Control "no-cache, no-store, must-revalidate" Header always set Pragma "no-cache" Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" </IfModule> RewriteEngine On # 带.html后缀的请求301跳转到无后缀地址 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.html\ HTTP/ RewriteRule ^(.*)\.html$ /$1 [R=301,L] # 无后缀请求重写到对应.html文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^([^/]+)$ $1.html [NC,L]
内容的提问来源于stack exchange,提问作者Moorthi
相关产品推荐
相关产品推荐

