.htaccess重定向多个不同的“;?p=";到特定页面

.htaccess重定向多个不同的“;?p=";到特定页面,.htaccess,redirect,mod-rewrite,.htaccess,Redirect,Mod Rewrite,我正试图解决这个重定向问题: RedirectMatch 301 /?p=10 /my-first-page RedirectMatch 301 /?p=20 /my-second-page RedirectMatch 301 /?p=30 /my-second-page RedirectMatch 301 /?p=40 /my-third-page 由于重定向不能以这种方式工作,由于?,我为其中一个找到了这个解决方案: RewriteCond %{QUERY_STRING} p=10 [NC

我正试图解决这个重定向问题:

RedirectMatch 301 /?p=10 /my-first-page
RedirectMatch 301 /?p=20 /my-second-page
RedirectMatch 301 /?p=30 /my-second-page
RedirectMatch 301 /?p=40 /my-third-page
由于重定向不能以这种方式工作,由于
,我为其中一个找到了这个解决方案:

RewriteCond %{QUERY_STRING} p=10 [NC]
RewriteRule ^(.*)$ /my-first-page? [L,R=301]
我的问题是,我是否可以优化它,不为我尝试的每个重定向写这两行代码?我是否可以至少插入所有必须使用数组重定向到同一目标页的页码(20和30)

我可能要这样做大约100页,所以任何优化是赞赏的。谢谢你的帮助

我能不能优化一下,不为我试图做的每一个重定向写这两行代码

您不能单独在
.htaccess
中执行此操作,因为似乎没有任何“模式”将此数字id映射到目标URL

(如果您有权访问服务器配置,那么您可以创建一个
重写映射
,其中包含ID到URL的映射。然后可以从
.htaccess
调用该映射。但我假设您没有访问服务器配置的权限?)

我是否可以至少插入所有必须使用数组重定向到同一目标页的页码(20和30)

你当然可以这样做。或者使用注释中提到的@CBroe中的替换(例如
(20 | 30 | 40)
),或者使用其他一些正则表达式模式。例如,
[1-4]0
匹配
10
20
30
40

但是,与其“重定向”,不如在内部将请求重写到相同的目标页面,然后使用服务器端脚本查找ID并发出适当的外部重定向(如果需要重定向)

例如:

RewriteCond %{QUERY_STRING} ^p=(10|20|30|40)$
RewriteRule ^$ redirect-handler.script [L]
请注意,除非确实需要同时匹配
p
p
,否则不需要
NC

然后在
/redirect handler.script
中存储所有应重定向到的ID和URL的数组,并根据需要发出外部3xx重定向

在上面的示例中,默认情况下,查询字符串(例如,
p=10
)会传递给目标脚本-如果您在目标脚本中使用相同的URL参数名称,则无需显式传递该字符串。但是,如果您希望显式地传递值(可能传递给不同的参数名称,例如
id
),则可以修改上述规则,如下所示:

RewriteCond %{QUERY_STRING} ^p=(10|20|30|40)$
RewriteRule ^$ redirect-handler.script?id=%1 [L]
其中,
%1
是对上次匹配模式中捕获的子模式的反向引用。也就是说,只要符合
(10 | 20 | 30 | 40)


请注意,这与
example.com/?p=10
格式的请求相匹配,如
RewriteRule
模式
^$
(空URL路径)所示。

您可以使用此模式语法列出备选方案,
p=(20 | 30 |…)
@CBroe这是一个好的开始,thx