该网页的访问方式如下:
`example.com/` or `example.com/?site=website`
在此示例中,我访问的是网站位于示例.com领域。
有人可以建议一种重写规则的最佳方法,以便显示和访问上述内容example.com/website
,或者仅example.com/
在未site
发送任何内容时才显示和访问?
nginx,Centos 7
更新
尝试了以下操作:
location / {
index index.php;
rewrite ^/(website)$ /site?$1;
}
答案1
几周前几乎有一个相同的问题:
https://gist.github.com/cnst/3521404dfdf5cb7b4c526b5c6dff38ff
location = / {
if ($arg_site) {
return 302 /$arg_site;
}
return 200
"<!DOCTYPE html><title>site</title>
<form><input name='site' value='website'/></form>\n";
}
location / {
rewrite ^/([^/]*)\$ /?site=$1 break;
proxy_pass http://localhost:7381;
}
这个想法是你创建一个重定向循环,但实际上并非如此,因为外部重定向和内部重定向之间存在差异,所以循环不是一个封闭的循环,因为一个重定向明确地只是外部的,而另一个重定向明确地只是内部的。
答案2
这应该可以工作。基本上,它会捕获斜线后、字符串结束前的字符串,并使用该字符串作为参数调用站点
location /
rewrite ^/(website)$ /site?$1;
}
浏览器需要使用如下 URLhttp://example.com/abcd,Nginx 内部会调用http://example.com/site=abcd 。您显然需要设置一个位置来响应该 URL 上的请求。例如
location /site
proxy_pass localhost:1234;
}
我使用普通的 Nginx 配置进行了测试,它与上面的配置唯一的不同之处在于测试所需的 .html 扩展名。
server {
listen 80;
server_name test1.example.com;
location / {
root /var/www/test1;
rewrite ^/(website).html$ /site.html?$1;
}
}
我创建了两个文件,website.html 和 site.html,内容是它们的文件名。如果不重写,浏览器会显示“website”。如果重写,则显示“site”。这证明测试配置有效。