非www转www与会员子域名重定向的.htaccess规则冲突问题
解决.htaccess规则冲突的方案
核心问题在于会员子域名规则的匹配条件不够严谨,加上规则顺序优先级错误,导致主域名请求被误匹配。以下是修正后的完整规则及说明:
修正后的完整.htaccess规则
RewriteEngine On # 优先处理非www转www重定向 RewriteCond %{HTTP_HOST} ^example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301] # 会员子域名重定向(仅匹配合法非www子域名) RewriteCond %{REQUEST_URI} ^/$ RewriteCond %{HTTP_HOST} ^(?!www\.)([a-zA-Z0-9-]+)\.example\.com$ [NC] RewriteRule ^(.*)$ https://www.example.com/member-photos/${liusers:%1|0} [L]
关键修改说明
- 调整规则顺序:把非www转www规则放在最前面,确保主域名
example.com的请求优先被重定向到www,不会进入后续会员规则的判断流程。 - 收紧会员规则的匹配条件:
- 使用负向预查
(?!www\.)排除www子域名,同时用[a-zA-Z0-9-]+明确限定子域名的合法字符范围,确保只匹配xxx.example.com这类带有效子域名的请求。 - 给正则加上
$结尾,避免匹配到带末尾多余点的异常域名(比如example.com.)。
- 使用负向预查
- 精准匹配主域名:非www规则的条件加上
$,确保只匹配example.com,不会误匹配其他子域名。
原规则冲突原因
原会员规则的^(.*)\.example\.com正则,当服务器返回的HTTP_HOST出现异常格式(比如带末尾点example.com.)时,会被误匹配,捕获组为空后触发${liusers:|0}跳转到/member-photos/0;同时规则顺序靠后,主域名请求没被提前拦截,导致进入错误的规则分支。
内容的提问来源于stack exchange,提问作者Richard PB
相关产品推荐
相关产品推荐

