使用Nginx实现根据 IP 匹配指定 URL

原始的 nginx 配置

upstream service_test {

server 127.0.0.1:8080;

}

server

{

listen    80;

server_name test.com;

index index.html index.php;

root /tmp/test.com;

error_page 404 http://test.com/404.html;

error_page 502 http://test.com/502.html;

error_page 500 http://test.com/500.html;

location ~* \.(gif|jpg|jpeg|png|css|js|ico|txt|svg|woff|ttf|eot)$

{

rewrite ^(.*)$ /static$1 break;

root /tmp/test.com; #

expires 1d;

}

location ~* \.(html|htm)$

{

rewrite ^(.*)$ /static$1 break;

roo /tmp/test.com; #

expires 900s;

}

location / {

proxy_pass http://service_test;

include /opt/conf/nginx/proxy.conf;

}

修改后的 Nginx 配置

upstream service_test {

server 127.0.0.1:8080;

}

server

{

listen    80;

server_name test.com;

index index.html index.php;

root /tmp/test.com;

error_page 404 http://test.com/404.html;

error_page 502 http://test.com/502.html;

error_page 500 http://test.com/500.html;

location ~* \.(gif|jpg|jpeg|png|css|js|ico|txt|svg|woff|ttf|eot)$

{

rewrite ^(.*)$ /static$1 break;

root /tmp/test.com; #

expires 1d;

}

location ~* \.(html|htm)$

{

rewrite ^(.*)$ /static$1 break;

roo /tmp/test.com; #

expires 900s;

}

set $flag 0;

if ($request_uri ~* "^/fuck/\w+\.html$") {

set $flag "${flag}1";

}

if ($remote_addr !~* "192.168.0.50|192.168.0.51|192.168.0.56") {

set $flag "${flag}2";

}

if ($flag = "012") {

rewrite ^ /index.html permanent;

}

location / {

proxy_pass http://service_test;

include /opt/conf/nginx/proxy.conf;

}

在实现需求的过程中出现的问题

把 if 指令 和 proxy_pass 都放在 location 下面的话,if 指令里面的内容不会执行,只会执行 proxy_pass。

location / {   if ($remote_addr !~* "192.168.0.50|192.168.0.51|192.168.0.56") {      rewrite ^ /index.html permanent;   }   proxy_pass http://service_test;   include /opt/conf/nginx/proxy.conf;}

if 指令下面使用 proxy_pass 指令问题

像下面这样使用会报错,错误的方式:

if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {

proxy_pass http://test.com/fuck;

}

正确的方式:

if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {

proxy_pass http://test.com$request_uri;

}

或是

if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {

proxy_pass http://test.com;

}

如果你是直接另外启动一个 location 的话,比如启动如下 location :

location /fund {     if ($remote_addr !~* "192.168.0.50|192.168.0.51|192.168.0.56") {

rewrite ^ /index.html permanent;

}  }

这样的方式也是不支持的,当用 IP 192.168.0.50 访问的时候,没有达到我们的业务需求,会报错 400

时间: 2024-10-19 12:24:25

使用Nginx实现根据 IP 匹配指定 URL的相关文章

php 正则匹配指定url的参数

function get_url_params($url, $arg_name) { $regx = '/.*[&|\?]'. $arg_name .'=([^&]*)(.*)/'; preg_match($regx, $url, $match); return $match[1]; } $str = $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; var_dump($str); //preg

nginx反向代理,动静态请求分离,以及nginx缓存应用,以及使用ngx_cache_purge清除指定URL

一,nginx反向代理配置 #tomcat Java代码   upstream tomcat_server{ server 127.0.0.1:8080; } erver{ listen 80; server_name www.wolfdream.com; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X

python分析nginx日志的ip,url,status

Python 脚本如下: #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'lvnian' #!/usr/bin env python # coding: utf-8 import MySQLdb as mysql import sys, os db = mysql.connect(user="root",passwd="[email protected]",db="intest",

Nginx专题: 从编译安装到URL重写

Nginx专题: 从编译安装到URL重写 前言 本文主要实现使用Nginx作为Web服务器, 并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中 环境介绍 笔者只有一台虚拟机, 桥接到室内的路由器便于手机进行访问, IP地址为192.168.1.103 Nginx介绍 engine x发音同Nginx, 作者是Igor Sysoev,是目前世界上占有率第三的Web服务器软件. Nginx是一款轻量级的Web服务器,可实现反向代理,URL rewri

Nginx实现基于ip的访问控制(Ngx_http_access_module模块)

Nginx实现基于ip的访问控制功能:(Ngx_http_access_module) 官方文档:http://nginx.org/en/docs/http/ngx_http_access_module.html 官方示例: The ngx_http_access_module module allows limiting access to certain client addresses.限定资源只被指定的客户端访问. Example Configuration: location / {

【转载】Python使用中文正则表达式匹配指定中文字符串的方法示例

本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

Nginx中的一些匹配顺序总结

Nginx中经常需要做各种配置,总结如下: 1.server_name配置 nginx中的server_name指令主要用于配置基于名称虚拟主机,同一个Nginx虚拟主机中,可以绑定多个server_name,各个域名用空格隔开即可.如下: server { listen 80; server_name test.com www.test.com; ... ... } 如果server_name有多个,那么通过代码如$_SERVER["SERVER_NAME"]获取的始终将是Nginx

nginx 配置禁用ip地址访问

做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描.拉取.注入等图谋不轨行为吧?对于直接对外的WEB服务器,我们可以直接通过 iptables . Nginx 的deny指令或者是程序来ban掉这些恶意请求. iptables 需要root权限配置 下面介绍使用nginx 来配置ip禁用 首选需要我们熟悉nginx 的deny指令 allow 语法:     allow address | CIDR | unix: | all; 默认值:     - 配置段:     http, server

Nginx 配置指令location 匹配符优先级和安全问题【转】

Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";"号,语句块用"{}"括起来.配制好,直接nginx -t 检查配制情况,配制成功,直接运行:service nginx reload.服务器没有任何宕机情况下,实现平稳修改配置.最近一直在做location 配置,遇到优先级别问题(如果配置不当可能存在安全隐患哦),以下是个人学习一