非WWW转WWW的Mod Rewrite规则被后续规则异常匹配问题
问题解决:非WWW转WWW规则被后续规则错误捕获
你的问题核心在于第一条非WWW转WWW的Rewrite规则缺少L标志,导致重定向操作执行后,Apache没有终止当前规则集的处理,而是继续匹配后续规则,最终触发了最后一条pages.php的重写规则,才出现了错误的跳转结果。
修正后的完整规则
# Redirect non-www to www + enforce HTTPS RewriteCond %{HTTP_HOST} !^www.site-name.com$ [NC] RewriteRule ^(.*)$ https://www.site-name.com/$1 [R=301,L] # Enforce HTTPS for www requests RewriteCond %{HTTPS} =off RewriteRule ^(.*)$ https://www.site-name.com/$1 [R=301,L] # Sections RewriteRule ^sections/([^/]+)/$ /section.php?slug=$1 [NC,L] # Content managed pages RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !\.php$ RewriteRule ^(.*)$ /pages.php?slug=$1 [L]
关键修正点说明
- 给第一条规则添加
L标志:[R=301,L]中的L代表"Last",执行这条重定向后会立即终止当前规则集的处理,浏览器会发起新的https://www.site-name.com/...请求,此时新请求重新走规则集时,后续的Sections和pages规则就能正确匹配WWW地址的请求,不会出现错误嵌套。 - 给Sections规则添加
L标志:避免匹配Sections规则后继续触发pages规则。 - 统一路径开头的斜杠:重写目标前加上
/(比如/section.php),确保路径解析正确,避免相对路径导致的错误。
现在访问https://site-name.com/sections/something/时,会先触发第一条规则重定向到https://www.site-name.com/sections/something/,浏览器发起新请求后,Sections规则会匹配并正确重写到/section.php?slug=something,不会再触发最后一条pages规则。
内容的提问来源于stack exchange,提问作者Bernie Davies
相关产品推荐
相关产品推荐

