.htaccess重写规则含空格变量失效问题求助
问题分析与解决方案
核心问题
你的重写规则失效是因为第二个RewriteRule的正则表达式没有包含空格字符。
原规则中的捕获组([0-9a-zA-Z_-]+)仅匹配字母、数字、下划线和连字符,当路径中出现空格(比如john cena)时,这个规则无法匹配请求,请求会被前面的^([^\.]+)$ $1.php规则处理——它会尝试寻找partners/1/john cena.php文件,显然该文件不存在,导致访问失败。
修正步骤
修复正则表达式,允许匹配空格
修改第二个RewriteRule,把捕获组改成包含空格的形式,比如:RewriteEngine On #RewriteRule ^index$ index.php [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] # 允许捕获组包含空格 RewriteRule ^partners/([0-9]+)/([0-9a-zA-Z_\s-]+) partners.php?id=$1&name=$2 [NC,L]这里
\s代表匹配任意空白字符(包括空格、制表符等),如果你只想匹配空格,也可以直接把空格加入字符集:([0-9a-zA-Z_ -]+)(注意连字符放在最后,避免被解析为范围符)。修正语法错误
原规则中第一个RewriteCond {REQUEST_FILENAME} !-d缺少百分号,正确写法是RewriteCond %{REQUEST_FILENAME} !-d,否则该条件不生效,可能引发其他重写异常。
补充说明
浏览器在处理地址栏中的空格时,会自动将其编码为%20,Apache在处理RewriteRule时会自动解码%20为空格,所以修正后的规则可以正常匹配这类请求。
内容的提问来源于stack exchange,提问作者Samin
相关产品推荐
相关产品推荐

