.htaccess Htaccess将第一个参数重写到虚拟目录

ltskdhd1  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(106)

我只想重写一个虚拟目录的url的参数type
这个

example.com/v1/example/?a=b&c=d&e=f …

应加载

example.com/v1/index.php?type=example&a=b&c=d&e=f …

我的一个尝试:

RewriteEngine On
RewriteRule ^v1/example/?(.*) v1/index.php?type=example$1 [L,QSA,NC]

你能看出我做错了什么吗?

mgdq6dx1

mgdq6dx11#

RewriteRule ^v1/example/?(.*) v1/index.php?type=example$1 [L,QSA,NC]

对于这个特定的例子,这实际上应该“工作”(偶然),但它是基于一些误解。
RewriteRulepattern 只匹配URL路径。要匹配查询字符串,您需要一个单独的 conditionRewriteCond指令)并匹配QUERY_STRING服务器变量。但是,看起来您根本不需要匹配查询字符串,您只需要添加到它。
例如,要重写示例请求,可以使用以下代码:

RewriteEngine On
RewriteRule ^v1/example/$ v1/index.php?type=example [QSA,L]

QSA标志将原始查询字符串(如果有)附加到重写的请求上。
我会质疑这里使用的NC标志(这就是为什么我已经删除了它),因为它可能会促进重复的内容。
还要注意.htaccess中指令的顺序可能很重要,因此您可能无法将此规则放在“任何地方”。您需要避免与其他规则冲突。
但是,如果example(第二个路径段)是 variable,那么您可以执行类似以下的操作:

RewriteRule ^v1/([\w-]+)/$ v1/index.php?type=$1 [QSA,L]

其中,example只能由正则表达式[\w-]+表示的字符0-9a-zA-Z_(下划线)和-(连字符)组成。并且必须是1个或多个此类字符。
同时考虑提取第一个路径段,以避免重复。例如:

RewriteRule ^(v1)/([\w-]+)/$ $1/index.php?type=$2 [QSA,L]

相关问题