在 Nginx 中重写并强制重定向重写原始 URL

在 Nginx 中重写并强制重定向重写原始 URL

我有这个实例,其中 html 搜索<form>强制它转到/search/index.php?q=term并且想使用类似的内容/search/term

目前的配置如下:

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}

直接访问该位置是可行的,但是在填写表格并进行搜索时,它将使用“原点”而不是重写。

我尝试使用“向后”重定向,但这会导致 nginx 服务崩溃:

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
    redirect ^/search/index.php?q=(.+) /search/$1;
}

我也尝试过用permanent标志重写,但没有做任何事情

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
    rewrite ^/search/index.php?q=(.+) /search/$1 permanent;
}

我知道可以用 PHP 实现同样的效果,如下所示:

// On the top of /search/index.php
if (str_starts_with($_SERVER['REQUEST_URI'], '/search/index.php')){
    $protocol = ($_SERVER['HTTP_X_FORWARDED_PROTO'] == "https") ? "https" : "http";
    $server = $_SERVER['HTTP_HOST'];
    $queries = array();
    parse_str($_SERVER['QUERY_STRING'], $queries);
    $search = $queries['q'] ?? "";
    header("Location: $protocol://$server/search/$search");
}

但我认为如果 nginx 可以处理这个问题(如果可能的话)会更好。

有谁知道如何重写和重定向从原点的访问?

答案1

现有的配置如下:

location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}
location ~ \.php$ {
    ...
}

该 URI/search/index.php在内部使用,因此尝试使用rewrite ^/search/index.php?q=(.+) /search/$1 permanent;将产生重定向循环。

将 URI 标识为外部请求,您需要查看$request_uri变量。为此,您需要使用臭名昭著的 if语句。例如:

if ($request_uri ~ ^/search/index\.php\?q=(.+)) {
    return 301 /search/$1;
}
location /search/ {
    rewrite ^/search/(.+) /search/index.php?q=$1;
}
location ~ \.php$ {
    ...
}

相关内容