如何通过.htaccess阻止网站URL中的空格或%20?
阻止含空格或%20的URL访问
嘿,这个问题很容易解决——我们只需要在你的现有重写规则前添加一个条件,拦截任何包含空格(包括URL编码后的%20)的请求即可。
具体修改方案
把你的.htaccess内容改成这样:
RewriteEngine on # 拦截所有包含空格(解码后的%20)的请求,返回404错误 RewriteCond %{REQUEST_URI} \s RewriteRule ^ - [R=404,L] # 你原来的重写规则 RewriteRule ^([a-z]+)/([a-z-]+)/([0-9]+).html$ filecat.php?LANGUAGE=$1&CITY=$2&page=$3 [L]
为什么这样有效?
- mod_rewrite在处理规则前会自动将URL编码的字符解码,所以
%20会被转换成实际的空格字符。 %{REQUEST_URI}变量存储了解码后的请求路径,\s是正则表达式中匹配空白字符的元字符(包括空格、制表符等,这里主要针对空格)。- 一旦匹配到包含空格的请求,
RewriteRule ^ - [R=404,L]会直接返回404错误,并且终止后续规则的处理,彻底阻止这类请求到达你的filecat.php脚本。
可选调整
- 如果你想返回403禁止访问而不是404,把
R=404改成R=403即可。 - 如果你只想严格拦截
CITY部分的空格(而不是整个URL),可以把条件改成针对第二个捕获组,但其实直接拦截整个URL中的空格更符合你的友好URL设计逻辑——毕竟你的规范里CITY应该只包含小写字母和连字符。
额外说明
你提到原有规则也能处理带空格的URL,大概率是因为当重写规则不匹配时,你的服务器配置(比如默认的ErrorDocument或前端控制器)把请求转发到了filecat.php,导致脚本依然接收到了带空格的参数。添加这个拦截条件后,就能从根源上阻止这类不符合规范的请求。
内容的提问来源于stack exchange,提问作者ffalzoabi
相关产品推荐
相关产品推荐

