巧用map解决nginx的Location里if失效问题
需求: 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 (待深入研究)
研究了一番, 发现网上有几篇文章相关:
- https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ 万恶的IF, 不知道什么时候会失效...
- https://stackoverflow.com/questions/50268485/nginx-try-files-with-add-header 遇到问题的人
- https://trac.nginx.org/nginx/ticket/97 try_files and alias problems
巧用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失效问题的更多相关文章
- 解决NGINX的WORDPRESS伪静态规则失效的问题
解决NGINX的WORDPRESS伪静态规则失效的问题 前两天搬到了EMSVPS的PR线路上,用上了最新的WDCP2.0管理面板,支持多用户管理(我们几个合租的VPS,最需要这个功能了),感觉很不错, ...
- 最完美解决Nginx部署ThinkPHP项目的办法
网上通用解决方法的配置如下: server { ... location / { index index.htm index.html index.php; #访问路径的文件不存在则重写URL转交给T ...
- nginx的location和rewrite
1 Nginx rewrite基本语法 Nginx的rewrite语法其实很简单.用到的指令无非是这几个 set if return break rewrite 麻雀虽小,可御可萝五脏俱全.只是简单的 ...
- Nginx配置location总结及rewrite规则写法
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "Helvetica Neue"; color: #323333 } p. ...
- rewrite规则写法及nginx配置location总结
rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用. 例如http://seanlook.com/a/we/index.php ...
- Nginx之location 匹配规则详解
有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...
- 转:Nginx 配置 location 总结及 rewrite 规则写法
转: http://www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名 ...
- 【转】nginx配置location总结及rewrite规则写法
原文:http://seanlook.com/2015/05/17/nginx-location-rewrite/ 1. location正则写法 location = / { # 精确匹配 / ,主 ...
- 解决nginx上传模块nginx_upload_module传递GET参数
解决nginx上传模块nginx_upload_module传递GET参数的方法总结 最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传 ...
随机推荐
- 入门Kubernetes - .Net Core 运行
前言: 之前文章 对Kubernetes 的一些基础概念及在windows下的环境搭建,接下来把.Net Core 运行到Kubernetes 中,在实际的操作中,对Kubernetes 的进一步学习 ...
- canvas绘制动画的技巧
我们拿下图中的沿着线段轨迹移动的原点来举例,怎么来实现这个动画! 1)定义路径集合Path,里面规定关键坐标点如startPoint和endPoint,设置从startPoint移动到endPoint ...
- kubelet分析-csi driver注册分析-Node Driver Registrar源码分析
kubernetes ceph-csi分析目录导航 Node Driver Registrar分析 node-driver-registrar是一个sidecar容器,通过Kubelet的插件注册机制 ...
- 2021年Wordpress手把手教你做个独立站——部署篇
2021年Woocommerce电商主题的安装部署教程 Woocommerce是一个Wordpress的一个流行的电商插件.完成Wordpress的安装即已完成80%.剩下的便是去寻找一款合适的自己喜 ...
- 并发王者课-铂金8:峡谷幽会-看CyclicBarrier如何跨越重峦叠嶂
欢迎来到<并发王者课>,本文是该系列文章中的第21篇,铂金中的第8篇. 在上一篇文章中,我们介绍了CountDownLatch的用法.在协调多线程的开始和结束时,CountDownLatc ...
- BFS经典面试题——C++版
文章目录 蛇梯棋 单词接龙 青蛙过河 蛇梯棋 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...
- 11、ssh自动化脚本编写
11.1.如何一键自动化安装50台规模集群网站搭建: 1.自动化思路: kickstart无人值守安装linux系统(自动创建用户.密码.优化): 分发机上创建秘钥对.批量发走公钥(expect): ...
- Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)
MyBatis-Plus是MyBatis的增强工具,Generator通过MyBatis-Plus快速生成Entity.Mapper.Mapper XML.Service.Controller等模块的 ...
- 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法
"为什么这个功能用不了?" 程序员:"清一下缓存" 上篇洞悉系列文章给大家详细介绍了MySQL的存储内幕:洞悉MySQL底层架构:游走在缓冲与磁盘之间.既然聊过 ...
- Channel Allocation 贪心涂色
Channel Allocation 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> ...