如何通过HTACCESS获取无文件名请求路径实现维护页自动跳转
可以通过.htaccess实现该需求。Apache没有内置直接对应「不含文件名的请求路径」的系统变量,但可以通过内置变量结合函数或正则匹配提取到请求文件所属的文件夹路径,无需为每个子目录单独配置。
正确实现代码
方案1:Apache 2.4及以上版本(表达式写法,和你构想的逻辑最匹配)
直接用dirname()函数提取请求对应的目录路径,代码放在站点根目录的.htaccess中即可:
<IfModule mod_rewrite.c> RewriteEngine On # 排除维护页面本身和必要静态资源,避免死循环 RewriteCond %{REQUEST_URI} !^/assets/maintenance\.html$ RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif|ico|woff2?)$ [NC] # 判断请求所属目录下是否存在maintenance.txt RewriteCond "%{dirname:%{REQUEST_FILENAME}}/maintenance.txt" -f # 重定向到维护页,建议用503状态码(服务不可用)更符合语义,替换R=200即可 RewriteRule ^ /assets/maintenance.html [L,R=200] </IfModule>
方案2:兼容低版本Apache的重写规则写法
如果你的Apache版本低于2.4,用下面的代码也可以实现全目录自动适配:
RewriteEngine On # 排除维护页和静态资源 RewriteCond %{REQUEST_URI} ^/assets/maintenance\.html$ [OR] RewriteCond %{REQUEST_URI} \.(css|js|png|jpg|gif|ico|woff2?)$ [NC] RewriteRule ^ - [L] # 匹配带文件名的请求 RewriteCond %{DOCUMENT_ROOT}/$1/maintenance.txt -f RewriteRule ^(.*?)/[^/]*$ /assets/maintenance.html [L,R=200] # 匹配直接访问目录的请求 RewriteCond %{DOCUMENT_ROOT}/$1/maintenance.txt -f RewriteRule ^(.*)/$ /assets/maintenance.html [L,R=200]
注意事项
- 两种方案都不需要为子目录单独配置,放在根目录
.htaccess中会自动对所有子目录生效 - 静态资源的排除规则可以根据你的实际需求调整,避免维护页面的样式、脚本被拦截
- 业务场景下推荐返回503状态码而非200,方便搜索引擎识别站点处于维护状态,不会影响收录
内容的提问来源于stack exchange,提问作者DarkIntaqt
相关产品推荐
相关产品推荐

