Apache重写规则配置求助:解决/B路径子目录访问的重定向循环问题
解决Apache重写规则导致的重定向循环问题
问题根源
你当前的重写规则触发循环的核心原因:
当RewriteRule ^/B/.+ /B/ [PT]将/B/D这类请求重写到/B/后,Apache会依据DirectoryIndex设置自动尝试加载/B/index.html,而这个URL路径恰好符合^/B/.+的匹配规则,于是会再次被重写到/B/,如此反复形成循环。
同时,你的DocumentRoot设为A/B,/B/index.html对应的文件系统路径是A/B/B/index.html,这个路径实际并不存在,进一步加剧了异常触发的概率。
正确配置方案
修改重写规则,直接将匹配的请求内部重写到根目录的index.html(因DocumentRoot是A/B,/index.html就是你需要返回的B/index.html),并通过L标志终止后续重写规则,彻底避免循环:
<VirtualHost *:8080> ... DocumentRoot "/usr/local/var/www/A/B" Alias "/C" "/usr/local/var/www/A/C" <Directory "/usr/local/var/www/A"> DirectoryIndex index.html ... </Directory> RewriteEngine On # 匹配所有以/B/开头且包含后续内容的URL请求,内部重写到根目录的index.html RewriteRule ^/B/.+ /index.html [L] ... </VirtualHost>
关键说明
[L]标志:告知Apache这是最后一条重写规则,处理完成后不再执行后续规则,从根源上切断循环触发的可能。- 直接重写到
/index.html:跳过了/B/目录的自动处理环节,避免/B/index.html再次被规则匹配。 - 该规则属于内部重写,用户浏览器的URL不会发生变化,仅服务器返回
index.html的内容,完全适配前端单页应用路由场景。
补充场景适配
如果你的实际需求是:所有访问文件系统B目录下的子路径(即URL的/D、/E等)的请求都返回B/index.html,可将规则修改为更通用的形式:
RewriteRule ^/.+ /index.html [L]
内容的提问来源于stack exchange,提问作者vijay
相关产品推荐
相关产品推荐

