如果url包含某些参数,则使用.htaccess重定向站点

如果url包含某些参数,则使用.htaccess重定向站点,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,如果url包含某个参数,我将尝试使用.htaccess重定向我的站点 例如,当我的站点包含?lang=de时,我希望将该站点永久重定向到https://www.example.com/de/ 这就是我尝试过的: # BEGIN Redirects for mobile params RewriteEngine On RewriteCond %{REQUEST_URI} lang=de RewriteRule .* https://www.example.com/de/ # END Redirec

如果url包含某个参数,我将尝试使用.htaccess重定向我的站点

例如,当我的站点包含
?lang=de
时,我希望将该站点永久重定向到
https://www.example.com/de/

这就是我尝试过的:

# BEGIN Redirects for mobile params
RewriteEngine On
RewriteCond %{REQUEST_URI} lang=de
RewriteRule .* https://www.example.com/de/
# END Redirects for mobile params
任何帮助都将不胜感激,谢谢

更新:这是我现在正在尝试的,但我得到了:

# BEGIN Redirects for mobile params
RewriteEngine on
# if the query string contains a parameter called "lang"
RewriteCond %{QUERY_STRING} (?:^|&)lang=de
# then redirect (permanently) to /
RewriteRule ^ https://www.example.com/de/ [L,R=permanent]
# END Redirects for mobile params
但这会导致错误太多的重定向

更新:我发现当它把这个放在我的.htaccess的末尾时,它就开始工作了

我发现当它把这个放在我的
.htaccess
末尾时,它就开始工作了

这可能是由于先前的指令阻止了重定向循环(换句话说,存在冲突)。理想情况下,此重定向应该位于
.htaccess
文件的开头附近

但是,您仍然应该放弃重定向响应中的查询字符串。目前,重定向到
/de/
仍将包含
lang=de
URL参数。Apache2.4上的
QSD
标志将实现这一点。例如:

RewriteCond %{QUERY_STRING} (?:^|&)lang=(de)
RewriteRule !de/ /%1/ [QSD,R=permanent,L]
%1
反向引用包含查询字符串中捕获的“de”

我发现当它把这个放在我的
.htaccess
末尾时,它就开始工作了

这可能是由于先前的指令阻止了重定向循环(换句话说,存在冲突)。理想情况下,此重定向应该位于
.htaccess
文件的开头附近

但是,您仍然应该放弃重定向响应中的查询字符串。目前,重定向到
/de/
仍将包含
lang=de
URL参数。Apache2.4上的
QSD
标志将实现这一点。例如:

RewriteCond %{QUERY_STRING} (?:^|&)lang=(de)
RewriteRule !de/ /%1/ [QSD,R=permanent,L]

%1
反向引用包含在查询字符串中捕获的“de”。

由于重写目标不包含查询字符串,原始查询字符串将再次附加到它。如果您使用的是Apache2.4,请使用
QSD
标志来防止出现这种情况;如果是较低版本,也可以通过在目标URL的末尾添加一个问号来丢弃原始查询字符串。那么
/foo?lang=de
格式的URL呢?重定向中是否应保留URL路径?例如,
/de/foo
由于重写目标不包含查询字符串,原始查询字符串将再次附加到它。如果您使用的是Apache2.4,请使用
QSD
标志来防止出现这种情况;如果是较低版本,也可以通过在目标URL的末尾添加一个问号来丢弃原始查询字符串。那么
/foo?lang=de
格式的URL呢?重定向中是否应保留URL路径?例如,
/de/foo