Nginx
在 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 可以處理這個會更好(如果可能的話)。
有誰知道如何重寫,並從源重定向訪問?
現有配置類似於:
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$ { ... }