需求: Nginx根据参数来输出不同的header

我们想用Nginx来判断一些通用的参数, 根据参数情况在输出中不同的header, 或者cookie, 那么根据正常思路, 有如下配置:

      location  ^~ /test1/ {
root /home/app/services/test_html; if ($arg_ss != ''){
add_header Set-Cookie "ss=$arg_ss;Domain=.yourdomain.com;Path=/;Max-Age=604800" always;
} try_files $uri $uri/ /test1/index.html$query_string;
}

这会运行正常吗? 它会跑到404页面, 为什么哪? 反正去掉if这几行代码它就ok了.

      location  ^~ /test1/ {

        root /home/app/services/test_html;

        if ($arg_ss != ''){
add_header Set-Cookie "ss=$arg_ss;Domain=.yourdomain.com;Path=/;Max-Age=604800" always;
} ## Check for file existing and if there, stop ##
if (-f $request_filename) {
break;
} # Check for file existing and if there, stop ##
if (-d $request_filename) {
break;
} rewrite (.*) /test1/index.html?$query_string;
}

这会运行正常吗? 页面是正常的, 但是add_header无法生效, 猜测是因为rewrite, 所以自然不会保留header (待深入研究)

研究了一番, 发现网上有几篇文章相关:

巧用map替换if

最终我们发现了 https://stackoverflow.com/questions/39548301/if-conditions-break-try-files-in-nginx-configuration

总之就是if不靠谱, 那么map可以用来替换if, 最终结果:


map $ssKey $ssResult {
"" "";
default $ssValue;
} server {
listen 80;
server_name www.yourdomain.com;
root /home/app/services/test_html; location ^~ /test1/ {
root /home/app/services/test_html; # 根据参数设置
set $ssKey "$arg_ss";
set $ssValue "ss=$arg_ss;Domain=.yourdomain.com;Path=/;Max-Age=604800"; # 设置header, 如果为空nginx会忽略
add_header Set-Cookie $ssResult; try_files $uri $uri/ /test1/index.html?$query_string;
} }

这里使用了二个技巧:

  • map的key, value都可以是变量
  • add_header如果值为空, nginx会忽略

运行正常!

巧用map解决nginx的Location里if失效问题的更多相关文章

  1. 解决NGINX的WORDPRESS伪静态规则失效的问题

    解决NGINX的WORDPRESS伪静态规则失效的问题 前两天搬到了EMSVPS的PR线路上,用上了最新的WDCP2.0管理面板,支持多用户管理(我们几个合租的VPS,最需要这个功能了),感觉很不错, ...

  2. 最完美解决Nginx部署ThinkPHP项目的办法

    网上通用解决方法的配置如下: server { ... location / { index index.htm index.html index.php; #访问路径的文件不存在则重写URL转交给T ...

  3. nginx的location和rewrite

    1 Nginx rewrite基本语法 Nginx的rewrite语法其实很简单.用到的指令无非是这几个 set if return break rewrite 麻雀虽小,可御可萝五脏俱全.只是简单的 ...

  4. Nginx配置location总结及rewrite规则写法

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #323333 } p. ...

  5. rewrite规则写法及nginx配置location总结

    rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用. 例如http://seanlook.com/a/we/index.php ...

  6. Nginx之location 匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  7. 转:Nginx 配置 location 总结及 rewrite 规则写法

    转: http://www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名 ...

  8. 【转】nginx配置location总结及rewrite规则写法

    原文:http://seanlook.com/2015/05/17/nginx-location-rewrite/ 1. location正则写法 location = / { # 精确匹配 / ,主 ...

  9. 解决nginx上传模块nginx_upload_module传递GET参数

    解决nginx上传模块nginx_upload_module传递GET参数的方法总结 最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传 ...

随机推荐

  1. 进程与线程 .Net Core系列-多线程

    进程与线程 进程: 狭义定义:进程是正在运行的程序的实例 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分 ...

  2. PUN丨实用API

    原文地址:PUN丨实用API 当前房间人数 int num = PhotonNetwork.CurrentRoom.PlayerCount; 当前脚本是否属于当前玩家 //需继承MonoBehavio ...

  3. 创建Cloudflare CDN

    背景说明: XX全球版项目CDN, 原有改之前:主CDN为Akamai,备CDN为Cloudflare. 计划改之后:主CDN为Cloudflare,备CDN为Akamai. 原因:Akamai CD ...

  4. Prometheus+Grafana企业监控系统

    Prometheus+Grafana企业监控系统 作者 刘畅 实验配置: 主机名称 Ip地址 controlnode 172.16.1.70/24 slavenode1 172.16.1.71/24 ...

  5. centos Sonarqube ldap(AD域) 配置

    1. 测试ad 连接 命令: ldapsearch -h 192.168.1.4 -D LXWJadmin@wjj.local -w 用户密码 -b "OU=蓝翔技校,OU=挖掘机事业群,O ...

  6. iOS 针对txt文档进行解码

    如我上一篇文章记录,我加了打开其他APPtxt文件的小功能,紧接着碰到新问题了,我在测试过程中发现用户上传的TXT编码格式很多不单单是utf-8和gb2312,针对TXT文档进行解码,我一共经历过两个 ...

  7. 前端 | Vue 路由返回恢复页面状态

    需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果. 方案:路由参数:路由守卫 需求描述 在使用 Vue 开发前端的时候遇到一个场景:在首页进行一些数据搜索,点击搜索结果进入详情 ...

  8. 小程序之app.json not found

    起因 最近在部署几款小程序时,发现ext.json文件会被忽略不上传,查了一下资料发现原来是需要升级开发者工具了. 没想到升级以后,再开发项目时,就报错 app.json not found 解决方法 ...

  9. spring boot.2x 集成swagger 加入拦截器后 swagger不能访问

    忽略掉 swagger-resources下面的请求 以及忽略掉 v2下面的请求即可 转自:https://blog.csdn.net/hanwenyi520/article/details/7989 ...

  10. python之学生信息管理系统

    1 #!usr/bin/python 2 #encoding=utf-8 3 4 #1. 打印学生管理系统界面 5 def printStd(): 6 print ("*"*50) ...