![nginx -> 根据 cookies 使用 try_files 提供不同的文件(条件,if,then,else)](https://linux22.com/image/668445/nginx%20-%3E%20%E6%A0%B9%E6%8D%AE%20cookies%20%E4%BD%BF%E7%94%A8%20try_files%20%E6%8F%90%E4%BE%9B%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%88%E6%9D%A1%E4%BB%B6%EF%BC%8Cif%EF%BC%8Cthen%EF%BC%8Celse%EF%BC%89.png)
我需要配置一个 nginx 服务器,以便:如果用户有特定的 cookie,那么服务器必须发送一个文件,否则服务器必须发送另一个文件。我阅读了大量相关文章,但都无济于事,我也知道遇到一些问题,try_files
但location if
如何解决这个问题……
我有一个例子,它应该可以工作,但事实上却不行:
upstream site {
server localhost:4321;
}
server {
listen *:1234;
server_name site.com;
root /path/www/;
ssl on;
ssl_certificate /path/ssl.crt;
ssl_certificate_key /path/ssl.key;
location = / {
set $variable /path/index.html;
if ($http_cookie ~* "someCookie=someValue(?:;|$)") {
set $index_file /path2/index.html;
}
rewrite .* $index_file break;
try_files $uri/index.html $uri.html $uri @site;
}
}
答案1
尝试这样的操作:
if ($cookie_myCookieNameIsBlaBlaBla ~* "cookieValueThatIWannaMatch") {
# my logic in here
}
只要记住,根据 nginx 的文档,if 是邪恶的,所以要小心。
更多信息:
- http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
- https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
再见!
答案2
我是这样做的,虽然不确定是不是最好的解决方案,但确实有效。
location @rewrite {
if ($http_cookie ~* "someCookie=someValue(?:;|$)") {
rewrite .* /path1/file1.html last;
}
rewrite .* /path2/file2.html last;
}
location = / {
try_files $uri/index.html $uri.html $uri @rewrite;
}