Nginx

在 nginx 中重寫源 URL 並強制重定向

  • January 11, 2022

我有這個實例,其中一個 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 可以處理這個會更好(如果可能的話)。

有誰知道如何重寫,並從源重定向訪問?

現有配置類似於:

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$ {
   ...
}

引用自:https://serverfault.com/questions/1089643