同一位置块中的多个 if 如何交互?
Posted
技术标签:
【中文标题】同一位置块中的多个 if 如何交互?【英文标题】:How do multiple if in the same location block interact? 【发布时间】:2018-08-07 11:33:06 【问题描述】:我们很难理解多重 if 语句在 nginx 中是如何工作的:
-
我们有一个 if 语句,当请求来自某个域时,它应该设置 CORS 标头
我们有一个 if 语句,当请求方法为 OPTION 时,它应该设置一些标头。
但是,当请求同时具有方法 OPTIONS 并且来自某个域时,不会设置 CORS 标头。在 Nginx 中,多个 if 语句如何在单个位置上下文中工作?
server
listen 127.0.0.1:80;
server_name myserver.com;
set $cors '';
if ($http_origin ~ '^https?://*.\.com')
set $cors 'true';
location /
proxy_pass http://myserver:9000;
if ($cors = 'true' )
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
if ($request_method = 'OPTIONS')
# Tell client that this pre-flight info is valid for 20 days
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
### force timeouts if one of backend is died ##
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
### Set headers ####
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Front-End-Https on;
proxy_redirect off;
【问题讨论】:
它们是如何工作的?他们没有。见这里nginx.com/resources/wiki/start/topics/depth/ifisevil 我读到了,那么完成我需要的正确模式是什么?重复? 【参考方案1】:add_header
指令的行为与其他 Nginx 指令略有不同,因为如果它包含在当前块中,它不会从另一个配置块继承。
有几种方法取决于您在决定将哪些标头添加到哪里时需要多少粒度,您可以使用 map
指令,但看起来您只有 3 组标头,一组用于所有连接,然后您的两个条件集然后为简单起见,您可以将 ifs 移动到服务器块。
您有很多标题要添加,所以为了清楚起见,我会将每个集合保存在它自己的 .conf 文件中。然后在你的服务器块中你已经有一个 if 指令,所以改变它并添加你的另一个 if 语句,并包括你想要为服务器块中的每个人设置的代理标头:
include headers/proxy-headers.conf;
if ($http_origin ~ '^https?://*.\.com')
include headers/cors-headers.conf;
if ($request_method = 'OPTIONS')
include headers/options-headers.conf;
【讨论】:
以上是关于同一位置块中的多个 if 如何交互?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript -JQuery 中否定“if”语句块中的代码,例如“if not then ..”
如何与同一物理智能卡上的多个 javacard 应用程序交互(如 yubikey)