RewriteRule规则导致变量名部分内容被截断的问题求助
问题原因与解决方案
你的问题出在county部分的正则表达式允许匹配斜杠,导致正则引擎的贪婪匹配特性“吃掉”了title开头的club。
具体来说,你规则里的([a-zA-Z-/]+)是用来匹配county的,这个正则包含了/字符,意味着它可以匹配包含斜杠的字符串。当URL是/tx/travis/club/club-fast-cars时,正则引擎会尝试尽可能多地匹配county部分:
- 首先,它会尝试把
travis/club当作county(因为这符合[a-zA-Z-/]+的规则) - 接着,剩下的路径是
/club-fast-cars,规则里的/club/?会匹配其中的/club - 最后剩下的
-fast-cars就被当作了title参数,也就是你看到的$_GET['title'] == '-fast-cars'
而当title不以club开头时,比如fast-cars-club,正则引擎尝试匹配travis/club作为county后,剩下的/fast-cars-club无法匹配/club/?,所以会回溯,最终county只能匹配travis,title就能正常捕获完整的字符串。
修复方案
修改county部分的正则,禁止它匹配斜杠,因为county作为地区slug,本身不应该包含斜杠。你有两种选择:
- 更严格的匹配(仅允许字母和连字符):
RewriteRule ^([a-zA-Z-]{2})/([a-zA-Z-]+)/club/?([a-zA-Z0-9-]+)?/?$ /incl/pages/seo.club.php?state=$1&county=$2&title=$3 [NC,L]
- 更通用的匹配(允许任何非斜杠字符,比如数字、下划线等):
RewriteRule ^([a-zA-Z-]{2})/([^/]+)/club/?([a-zA-Z0-9-]+)?/?$ /incl/pages/seo.club.php?state=$1&county=$2&title=$3 [NC,L]
其中[^/]+是正则里的“否定字符集”,表示匹配任何不是斜杠的字符,能确保county只匹配到下一个斜杠为止,彻底避免贪婪匹配的问题。
另外,顺便提一句:你规则里的&应该改成&,虽然在你的测试中似乎没出问题,但在.htaccess里直接用&才是正确的参数分隔方式。
内容的提问来源于stack exchange,提问作者santa
相关产品推荐
相关产品推荐

