You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:35:59