htaccess 使用 GET 参数重定向 URL
htaccess Redirect URL with GET Parameters
我有一个 URL 格式为 http://www.example.com/?s=query
我想将此 URL 重定向到 http://www.example.com/search/query
我有以下 .htaccess
但我想检查一下是否有任何问题。我的 RewriteRule
看起来有点不稳定,我不知道它是否会给其他 URL 带来问题。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
我 运行 测试 Here 它似乎重定向到正确的 URL.
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
如果您接收到 % 编码的 URL 参数值,您可能需要 RewriteRule
指令上的 NE
(noescape
) 标志,否则目标URL 将被双重编码。 QUERY_STRING
服务器变量未被 Apache 解码。
这还取决于您如何将 /search/query
重写回 /?s=query
(或者可能更像 /index.php?s=query
?)- 大概您已经在稍后的配置中这样做了?您只希望此重定向应用于直接请求而不是重写请求(否则您将获得重定向循环)。确保这一点的一种简单方法是检查 REDIRECT_STATUS
env var 是否为空。
例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^s=(.*) [NC]
RewriteRule ^$ /search/%1 [NE,QSD,R,L]
其他要点:
-
QSD
标志(在 Apache 2.4 上)比将 ?
附加到 susbtitution 字符串的末尾更可取,以便删除查询字符串。
- 正则表达式
^s=(.*)
(尾部 $
是多余的)确实假设 s
是查询字符串开头唯一的 URL 参数。就目前而言,一切 都被假定为该值的一部分。例如。 s=foo&bar=1
将导致 /search/foo&bar=1
.
RewriteRule
指令中的 NC
标志是多余的。
- 您还应该检查
/index.php?s=<query>
吗? (或者 file/DirectoryIndex 正在处理请求。)
我有一个 URL 格式为 http://www.example.com/?s=query
我想将此 URL 重定向到 http://www.example.com/search/query
我有以下 .htaccess
但我想检查一下是否有任何问题。我的 RewriteRule
看起来有点不稳定,我不知道它是否会给其他 URL 带来问题。
RewriteEngine on
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC]
RewriteRule ^$ /search/%1? [NC,L,R]
我 运行 测试 Here 它似乎重定向到正确的 URL.
RewriteCond %{QUERY_STRING} ^s=(.*)$ [NC] RewriteRule ^$ /search/%1? [NC,L,R]
如果您接收到 % 编码的 URL 参数值,您可能需要 RewriteRule
指令上的 NE
(noescape
) 标志,否则目标URL 将被双重编码。 QUERY_STRING
服务器变量未被 Apache 解码。
这还取决于您如何将 /search/query
重写回 /?s=query
(或者可能更像 /index.php?s=query
?)- 大概您已经在稍后的配置中这样做了?您只希望此重定向应用于直接请求而不是重写请求(否则您将获得重定向循环)。确保这一点的一种简单方法是检查 REDIRECT_STATUS
env var 是否为空。
例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^s=(.*) [NC]
RewriteRule ^$ /search/%1 [NE,QSD,R,L]
其他要点:
-
QSD
标志(在 Apache 2.4 上)比将?
附加到 susbtitution 字符串的末尾更可取,以便删除查询字符串。 - 正则表达式
^s=(.*)
(尾部$
是多余的)确实假设s
是查询字符串开头唯一的 URL 参数。就目前而言,一切 都被假定为该值的一部分。例如。s=foo&bar=1
将导致/search/foo&bar=1
. RewriteRule
指令中的NC
标志是多余的。- 您还应该检查
/index.php?s=<query>
吗? (或者 file/DirectoryIndex 正在处理请求。)