URL重写技术咨询:如何将.../anything/article5改写为?o=anything&id=5
URL重写实现两种路径匹配的解决方案
嘿,别慌!正则看起来吓人,但其实咱们可以用两种简单的方式解决你的问题,完全不用太纠结复杂的语法~
方案一:用一条灵活的正则规则同时覆盖两种场景
你不需要新增多条规则,只需要把原来的规则改成支持可选的/article数字后缀的版本就行。我已经帮你把正则写得很简单了,直接用就好:
如果你用的是Apache(.htaccess配置)
原来的规则大概是这样:
RewriteEngine On RewriteRule ^([a-zA-Z0-9_-]+)$ ?o=$1 [L]
替换成下面这条,就能同时匹配/anything和/anything/article5:
RewriteEngine On RewriteRule ^([a-zA-Z0-9_-]+)(?:/article(\d+))?$ ?o=$1&id=$2 [L,QSA]
我给你拆解下每个部分的意思,帮你理解:
^([a-zA-Z0-9_-]+):捕获anything这部分内容,作为o参数的值(允许字母、数字、下划线、短横线,基本能覆盖大部分常见的路径名)(?:/article(\d+))?:这是可选的后缀部分,?:只是用来包裹分组不额外捕获,\d+匹配article后面的数字(也就是id的值),最后的?表示这部分可以不存在[L,QSA]:L表示这是最后一条执行的规则,QSA的作用是如果原URL有其他参数(比如/anything/article5?foo=bar),会自动保留这些参数,不会丢失
如果你用的是Nginx
原来的规则可能是:
rewrite ^/([a-zA-Z0-9_-]+)$ /?o=$1 last;
替换成这条即可:
rewrite ^/([a-zA-Z0-9_-]+)(?:/article(\d+))?$ /?o=$1&id=$2 last;
方案二:新增一条规则(更直观,适合正则新手)
如果你实在不想碰正则的可选分组,那咱们就新增一条更具体的规则,放在原来的规则前面,让服务器先匹配/anything/article5这种具体路径,再匹配/anything这种通用路径:
Apache配置示例
RewriteEngine On # 先匹配带/article数字的路径 RewriteRule ^([a-zA-Z0-9_-]+)/article(\d+)$ ?o=$1&id=$2 [L,QSA] # 再匹配原来的通用路径 RewriteRule ^([a-zA-Z0-9_-]+)$ ?o=$1 [L,QSA]
Nginx配置示例
# 先匹配带/article数字的路径 rewrite ^/([a-zA-Z0-9_-]+)/article(\d+)$ /?o=$1&id=$2 last; # 再匹配原来的通用路径 rewrite ^/([a-zA-Z0-9_-]+)$ /?o=$1 last;
这种方式的好处是规则逻辑非常清晰,不用理解复杂的正则语法,新手也能一眼看懂,而且执行顺序明确,不会出问题。
两种方案都能实现你要的效果,选哪种全看你觉得哪个更顺手~
内容的提问来源于stack exchange,提问作者pioupiou1211
相关产品推荐
相关产品推荐

