nginx rewrite和根据url参数location
最近项目中涉及到旧老项目迁移,需要在nginx上做些配置,所以简单学习了下,好记性不如烂笔头,先记下来。
rewrite
首先查看下nginx是否支持rewrite:
./nginx -V
不支持说明安装nginx时候缺少pcre,需要重新安装nginx:
#安装pcre
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz
tar -zxvf pcre-8.34.tar.gz
cd pcre-8.34
./configure
make
make install
#安装nginx
cd nginx-1.0.
./configure --conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.34 \
make
make install
#启动nginx
./nginx
#重启nginx
./nginx –s reload
示例:
比如现有如下的nginx配置:
worker_processes ;
#worker_cpu_affinity ; worker_rlimit_nofile ; error_log logs/error.log crit; pid logs/nginx.pid; events {
use epoll;
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream;
charset utf-; sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout ;
client_max_body_size 10m;
client_body_buffer_size 128k; upstream log {
server 192.168.80.147:; } server {
listen ;
server_name 192.168.71.51; location / {
proxy_pass http://log;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-REAL-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffer_size 4k;
proxy_buffers 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
} error_page /50x.html;
location = /50x.html {
root html;
} log_format log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access_log.log log; #设定查看Nginx状态的地址
location /NginxStatus {
#stub_status on;
access_log on;
auth_basic "NginxStatus";
#auth_basic_user_file conf/htpasswd;
}
}
}
现在需要作如下的重定向:
192.168.71.51/log.aspx –> 192.168.80.147:8338/log 192.168.71.51/do.aspx –> 192.168.80.147:8338/do 192.168.71.51/uplog.aspx –> 192.168.80.147:8338/log
可以如下配置:
……
server {
listen ;
server_name 192.168.71.51; rewrite ^(.*)(?i)uplog.aspx(.*)$ $1log$ break;
rewrite ^(.*)(?i)log.aspx(.*)$ $1log$ break;
rewrite ^(.*)(?i)do.aspx(.*)$ $1do$ break; location / {
proxy_pass http://log;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-REAL-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffer_size 4k;
proxy_buffers 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
……
关于这里的rewrite配置主要说明以下几点:
- rewrite用法: rewrite 正则 替换 标志位
- 第一行配置和第二行配置顺序不能颠倒,因为nginx会从上往下依次rewrite(break在这里不起作用);
- (?!)表示忽略大小写匹配(网上说的是~*,但好像不起作用,我的nginx版本是1.0.12);
- $1,$2表示前面正则表达式匹配到的部分;
- rewrite可以在server里也可以在location里,nginx会首先执行server里的rewrite,然后才会执行location,意味着location的是重写后的url,之后还会执行location里的rewrite,最后nginx还会拿结果去执行剩下的location。
关于nginx的rewrite详细用法可以参考详细参考文档:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/(很详细)
根据url参数location
实际开发中经常有根据请求参数来路由到不同请求处理者的情况,根据POST请求参数需要些nginx插件,这里主要简单介绍下如何根据GET参数来路由。
还是上面的配置文件。比如我们希望访问http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog当url中的参数c为config或uplog的时候(忽略大小写)我们路由到其他地方:
首先增加一个upstream,比如:
……
upstream other {
server 192.168.71.41:; }
……
然后在location里增加如下的判断即可:
……
location / { if ( $query_string ~* ^(.*)c=config\b|uplog\b(.*)$ ){
proxy_pass http://other;
}
……
关键是标红的行,$query_string表示url参数,后面是标准的正则匹配,需要的注意的是nginx中if有很多限制,语法很苛刻,具体参看上面的文档。
很简单却很实用的配置,希望能帮到正在找这方面信息的同学。
nginx rewrite和根据url参数location的更多相关文章
- 再谈Nginx Rewrite, 中文URL和其它
上次谈到过Nginx和中文URL的问题,这几天又加深了认识. 多分享几个关于Nginx Rewrite的经验. Nginx匹配指定中文URL的方法:rewrite "(*UTF8)^x{66 ...
- 【转】AngularJs $location获取url参数
// 带#号的url,看?号的url,见下面 url = http://qiaole.sinaapp.com?#name=cccccc $location.absUrl(); // http://qi ...
- Nginx Rewrite详解
Nginx Rewrite详解 引用链接:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 原文如下: 在新主机的迁移过程中,最大的困难就是W ...
- Nginx Rewrite研究笔记
原文出自:http://blog.cafeneko.info/2010/10/nginx_rewrite_note/ 在新主机的迁移过程中,最大的困难就是WP permalink rewrite的设置 ...
- AngularJs中url参数的获取
前言: angular获取通过链接形式访问的页面,要获取url中的参数,就不能通过路由的方式传递获取了,使用原生js或者jquery,又显得比较麻烦,好在angular已经封装了获取url参数的方法, ...
- js javascript 获取url,获得当前页面的url,静态html文件js读取url参数
获得当前页面的url window.location.href 静态html文件js读取url参数 location.search; //获取url中"?"符后的字串 下边为转载的 ...
- Nginx rewrite跳转 location匹配
目录: 一.常用的Nginx 正则表达式 二.location 三.rewrite 一.常用的Nginx 正则表达式 1 ^ :匹配输入字符串的起始位置 2 $ :匹配输入字符串的结束位置 3 * : ...
- 【Nginx】下载,请求限速,根据URL参数限速
这个场景是限制单个连接的下载速度,还有限制单个IP的连接数,或者单位时间内的请求数,实验环境 nginx1.9.x. 小例子为主,具体的细节请多看文档. 限制下载速度 location /downlo ...
- nginx rewrite 实现URL跳转
最近工作中常常要改nginx配置,学习了nginx中rewrite的用法 URL跳转这里说的URL跳转就是用户在访问一个URL时将其跳转到另一个URL上.常见的应用场景是让多个域名跳转到同一个URL上 ...
随机推荐
- FFmpeg AVPacket和AVFrame区别
简介 AVPacket:存储压缩数据(视频对应H.264等码流数据,音频对应AAC/MP3等码流数据)AVFrame:存储非压缩的数据(视频对应RGB/YUV像素数据,音频对应PCM采样数据)
- Eclipse工程文件夹 红叹号
问题产生: 重装系统后,换了个新版本的Eclipse,但是,使用以前的工程目录(工程目录重命名了)后,发现,一些工程上显示红叹号,仔细查看里面的代码,也没有错误 问题原因: 经过查看,是工程中,使用的 ...
- 在Java中使用SQLite的教程(转)
简介:这是在Java中使用SQLite的教程的详细页面,介绍了和java,有关的知识.技巧.经验,和一些java源码等. 简单的在Java中使用SQLite的教程 使用SQLiteJDBC封装 www ...
- pre 标签的使用注意事项
.news-msg{ // padding: 5px; white-space: pre-wrap; word-wrap: break-word; font-family:'微软雅黑'; } < ...
- 如何添加查找 ng vue 客户端快捷方式
1.查找文件的安装路径:右键: 2.然后resources里面的文件: 查看文件名的后缀: 3.asar -h 查找帮助 4.npm i asar -g 5.asar e app.asar rapp ...
- JSch远程执行脚本
JSch远程执行脚本 2017-02-24 在自动化测试的时候,需要远程操控服务器做一些操作,比如切日.起服务器.执行某些脚本.如何实现? 我们可以利用JSch,远程执行脚本.JSch是Java Se ...
- LeetCode: Reverse Integer 解题报告
Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, retur ...
- phpstorm 调试 laravel
Reference: http://www.cnblogs.com/imayanlong/p/6375950.html, https://segmentfault.com/a/11900000045 ...
- android手机安全性測试手段
android手机安全性測试手段 罗列一下自己经常使用的android手机安全性測试攻击手段: 1. fiddler和tcpdump+wireshark抓包分析,模拟改动http请求參数,检验漏洞 2 ...
- git将一个分支的某个文件合并到当前分支
有时在开发的feature中,整个分支的功能并没有完成开发完成,但是,有几个修改的基础文件需要合并到develop中,这个时候的操作步骤为: git checkout develop //切换 ...