使用.htaccess实现特定URL重定向的规则问题求助
.htaccess实现特定URL重定向的规则问题求助
嘿,我来帮你搞定这个.htaccess重定向的问题!你的需求很清晰:要把example.com/myvar这类请求(其中myvar是仅包含字母、数字和下划线的字符串)转发到router.php,但得排除掉带斜杠(比如example.com/admin/)或者带点(比如example.com/signout.php)的URL,对吧?
你之前写的规则有点复杂,而且正则断言的位置可能导致匹配逻辑出问题,所以才会出现“功能怪异”的情况。咱们来简化并修正一下,直接用更精准的规则就能解决问题:
RewriteEngine On # 匹配符合规则的单一路径段,自动排除带点、带斜杠的请求 RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9_]+)$ RewriteRule ^ router.php [QSA,L]
规则解释:
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9_]+)$:这个条件精确匹配请求URI是单个路径段——开头是/,后面跟着仅由字母、数字、下划线组成的字符串,然后直接结束。这样就天然排除了两种不需要重定向的情况:- 带斜杠的URL(比如
/admin/)会因为结尾有/,不符合$(字符串结束)的要求,不会被匹配; - 带点的URL(比如
/signout.php)里的.不在允许的字符集里,也不会被匹配。
- 带斜杠的URL(比如
RewriteRule ^ router.php [QSA,L]:QSA参数会保留原请求的查询字符串(比如/user123?foo=bar会转发成router.php?foo=bar),L表示这是最后一条规则,处理完就停止后续规则的执行。
如果你想更明确地把排除逻辑写出来,也可以用多条件叠加的方式,效果是一样的:
RewriteEngine On # 先排除包含点的请求 RewriteCond %{REQUEST_URI} !\. # 再排除结尾带斜杠的请求 RewriteCond %{REQUEST_URI} !\/$ # 最后匹配符合字符规则的单一路径段 RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9_]+)$ RewriteRule ^ router.php [QSA,L]
之前你的规则里用了负向断言(?!\.|\/),但因为位置和后续的分组逻辑,导致匹配范围超出了预期,反而容易误匹配一些不该处理的路径。换成上面这种精确匹配的方式,逻辑更清晰,也更可靠。
备注:内容来源于stack exchange,提问作者Mohe TheDreamy
相关产品推荐
相关产品推荐

