我只想重写一个虚拟目录的url的参数type。这个
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]
你能看出我做错了什么吗?
mgdq6dx11#
RewriteRule ^v1/example/?(.*) v1/index.php?type=example$1 [L,QSA,NC]
对于这个特定的例子,这实际上应该“工作”(偶然),但它是基于一些误解。RewriteRulepattern 只匹配URL路径。要匹配查询字符串,您需要一个单独的 condition(RewriteCond指令)并匹配QUERY_STRING服务器变量。但是,看起来您根本不需要匹配查询字符串,您只需要添加到它。例如,要重写示例请求,可以使用以下代码:
RewriteRule
RewriteCond
QUERY_STRING
RewriteEngine On RewriteRule ^v1/example/$ v1/index.php?type=example [QSA,L]
QSA标志将原始查询字符串(如果有)附加到重写的请求上。我会质疑这里使用的NC标志(这就是为什么我已经删除了它),因为它可能会促进重复的内容。还要注意.htaccess中指令的顺序可能很重要,因此您可能无法将此规则放在“任何地方”。您需要避免与其他规则冲突。但是,如果example(第二个路径段)是 variable,那么您可以执行类似以下的操作:
QSA
NC
.htaccess
example
RewriteRule ^v1/([\w-]+)/$ v1/index.php?type=$1 [QSA,L]
其中,example只能由正则表达式[\w-]+表示的字符0-9、a-z、A-Z、_(下划线)和-(连字符)组成。并且必须是1个或多个此类字符。同时考虑提取第一个路径段,以避免重复。例如:
[\w-]+
0-9
a-z
A-Z
_
-
RewriteRule ^(v1)/([\w-]+)/$ $1/index.php?type=$2 [QSA,L]
1条答案
按热度按时间mgdq6dx11#
对于这个特定的例子,这实际上应该“工作”(偶然),但它是基于一些误解。
RewriteRule
pattern 只匹配URL路径。要匹配查询字符串,您需要一个单独的 condition(RewriteCond
指令)并匹配QUERY_STRING
服务器变量。但是,看起来您根本不需要匹配查询字符串,您只需要添加到它。例如,要重写示例请求,可以使用以下代码:
QSA
标志将原始查询字符串(如果有)附加到重写的请求上。我会质疑这里使用的
NC
标志(这就是为什么我已经删除了它),因为它可能会促进重复的内容。还要注意
.htaccess
中指令的顺序可能很重要,因此您可能无法将此规则放在“任何地方”。您需要避免与其他规则冲突。但是,如果
example
(第二个路径段)是 variable,那么您可以执行类似以下的操作:其中,
example
只能由正则表达式[\w-]+
表示的字符0-9
、a-z
、A-Z
、_
(下划线)和-
(连字符)组成。并且必须是1个或多个此类字符。同时考虑提取第一个路径段,以避免重复。例如: