我有这个实例,其中 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$ {
...
}