巧用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无法轻易实现大文件上传 ...
随机推荐
- Spring Boot下的一种导出CSV文件的代码框架
1.前言 CSV,逗号分隔值(Comma-Separated Values),即为逗号分隔的文本文件.如果值中含有逗号.换行符.制表符(Tab).单引号及双引号,则需要用双引号括起来:如果值中包含 ...
- Etcd中linearizable read实现
linearizable 有点疑惑,不确定是现在浏览的版本没开发完全,还是没有按照论文的linearizable来实现. 按照论文所说,在客户端请求的时候,实际上是一个强一致的 exactly onc ...
- BGP路由技术
BGP路由技术 目录 一.BGP概述 1.1.自治系统 1.2.动态路由分类 1.3.BGP概念 1.4.BGP的特征 1.5.BGP工作原理 二.命令配置 2.1.BGP配置思路 2.2.命令 一. ...
- 『心善渊』Selenium3.0基础 — 8、使用CSS选择器定位元素
目录 1.CSS选择器介绍 2.CSS选择器定位语法 3.Selenium中使用CSS选择器定位元素 (1)通过属性定位元素 (2)通过标签定位元素 (3)通过层级关系定位元素 (4)通过索引定位元素 ...
- C++中运算符的重载
运算符重载相当于运算符的函数重载,用于对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型.我们之前提到过C++中的函数重载,可以根据形参的不同调用不同的函数,那么运算符重载跟函数重载的 ...
- 10 一键部署LNMP网站平台
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin NGINX_V=1.19.1 P ...
- 最大子序和:暴力->递归->动规->线段树
题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...
- CentOS-自定义SFTP用户及目录
ftp功能说明:通过SSH启动CentOS的sftp功能 创建用户组及用户(sftp可变) $ groupadd sftp $ useradd -g sftp -s /sbin/nologin -d ...
- Python管道进行数据的吞吐处理
import multiprocessing import random import time import datetime import struct import os import getF ...
- Ubuntu创建图标
起因 安装一些软件时,总是没有图标,导致无法固定到docky栏,所以极为不方便,所以需要自己创建图标. 操作 以创建微信图标为例 [Desktop Entry] Name=Wecaht #名字 Com ...