Nginx 将带参数的 URL 重写为不带参数的 URL

Nginx 将带参数的 URL 重写为不带参数的 URL

所以我有这个 URL:/web/cms.php?open=unsereteam

我想重定向至:https://www.camper-center.ch/portrait/unser-team.html

我尝试过这个:

rewrite ^/web/cms.php?open=unsereteam$ https://www.camper-center.ch/portrait/unser-team.html permanent;

和这个:

if ($args ~* "/web/cms.php?open=unsereteam") {
    rewrite ^ https://www.camper-center.ch/portrait/unser-team.html? last;
}

不起作用……

感谢 Ivan Shatsky 的帮助:

if ($request_uri = "/web/cms.php?open=unsereteam") {
    rewrite ^ https://www.camper-center.ch/portrait/unser-team.html? last;
}

如果我有多个参数,例如

if ($request_uri = "/web/listing.php?monat=03&jahr=2018") {
    rewrite ^ https://www.camper-center.ch/news/aktuell.html?month=03&year=2018? last;
}

我正在尝试类似的事情:

if ($arg_monat = "02" & $arg_jahr="2020") { 
    rewrite ^/web/cms\.php$ https://www.camper-center.ch/news/aktuell.html?month=02&year=2020? last;
}

但这显然也不起作用。

也许您对此也有解决方案?

提前致谢!

编辑:我正在尝试这样的事情:

if ($arg_monat && $arg_jahr ) {
    rewrite ^/web/listing\.php$ https://www.camper-center.ch/news/aktuell.html?month=$arg_monat&year=$arg_jahr? last;
}

最后我想要将第一个 url 重定向到第二个:

/web/listing.php?monat=02&jahr=2020

/news/aktuell.html?month=02&year=2020

答案1

正如人们一千遍所说的那样,rewritelocation指令都适用于规范化URI不包括请求的查询部分,但仅/web/cms.php针对您的情况。$args变量包含请求的查询部分(open=unsereteam针对您的情况)。它是$request_uri包含原始状态的完整请求 URI 的。您可以使用

if ($request_uri = "/web/cms.php?open=unsereteam") {
    rewrite ^ https://www.camper-center.ch/portrait/unser-team.html? last;
}

或不区分大小写的比较

if ($request_uri ~* "^/web/cms\.php\?open=unsereteam") {
    rewrite ^ https://www.camper-center.ch/portrait/unser-team.html? last;
}

但如果您的请求在参数之前有一些额外的查询参数,它将不匹配open。更好的方法是

if ($arg_open = "unsereteam") { # or ($arg_open ~* "^unsereteam$") for case insensitive check
    # do the rewrite only on '/web/cms.php' URI
    rewrite ^/web/cms\.php$ https://www.camper-center.ch/portrait/unser-team.html? last;
}

相关内容