Apache维护模式rewrite规则无法放行指定IP地址问题咨询
问题根因
你的配置逻辑错误,IP白名单的判断条件被错误绑定到了维护目录放行规则上,现有规则的触发逻辑完全不符合需求:仅当非白名单IP访问维护目录时才放行,其他请求没有命中白名单判断,导致你自己访问也会被重定向到维护页。
正确的逻辑应该是先校验访问IP是否属于白名单,如果是就直接跳过所有维护相关的重定向规则。
修正后的配置
# Force HTTPS (建议把HTTPS强制规则放最前面,避免后续跳转走HTTP) RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*)$ [NC] RewriteRule (.*) https://%1%{REQUEST_URI} [L,R=301] ## Maintenance <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 白名单IP直接跳过所有维护重写规则 RewriteCond %{REMOTE_ADDR} ^111\.111\.33\.44 [OR] RewriteCond %{REMOTE_ADDR} ^222\.222\.333\.444 RewriteRule ^ - [L] # 放行维护目录、静态资源和维护页面,避免跳转死循环 RewriteCond %{REQUEST_URI} ^/maintenance/ [OR] RewriteCond %{REQUEST_URI} \.(jpe?g?|png|gif|css|woff|woff2|eot|ttf|svg) [NC] RewriteRule .+ - [L] # 其余所有请求跳转到维护页 RewriteRule ^(.*) /maintenance/maintenance.html [R=307,L] </IfModule> ErrorDocument 503 /maintenance/maintenance.html ErrorDocument 307 /maintenance/maintenance.html <IfModule mod_headers.c> # 禁用缓存避免维护页缓存影响后续正常访问 Header Set Cache-Control "max-age=0, no-store" </IfModule> ## End Maintenance # php -- BEGIN cPanel-generated handler, do not edit # Set the “ea-php74” package as the default “PHP” programming language. <IfModule mime_module> AddHandler application/x-httpd-ea-php74 .php .php7 .phtml </IfModule> # php -- END cPanel-generated handler, do not edit
注意事项
- 替换配置中的
111.111.33.44、222.222.333.444为你真实的本地公网出口IP和服务器公网IP - 如果站点使用了CDN服务,
%{REMOTE_ADDR}会获取到CDN节点IP而非真实访客IP,需要将对应参数替换为%{HTTP_X_FORWARDED_FOR}获取真实IP - 测试时使用浏览器无痕模式,避免307临时重定向缓存干扰测试结果
内容的提问来源于stack exchange,提问作者liquidRock
相关产品推荐
相关产品推荐

