资讯专栏INFORMATION COLUMN

Nginx -- 根据 IP 匹配指定 URL

Pocher / 2755人阅读

摘要:业务需求业务和开发同事需要我这边做一条规则,所有访问为非上海广州外网,为的请求都跳转到。这样就可以在生产上做隔离,不影响其他用户的服务。

业务需求

业务和开发同事需要我这边做一条规则,所有访问 ip 为非上海、广州 office 外网 ip,url 为http://test.com/fuck/index.html 的请求都跳转到 http://test.com/index.html 。然后所有在上海和广州 office 的外网 IP 访问 http://test.com/fuck/index.html 依然还是 http://test.com/fuck/index.html。这样就可以在生产上做隔离,不影响其他用户的服务。

</>复制代码

  1. 注:因为目前生产上的 Nginx 没有做 lua 支持,所以就无法通过使用 lua 来实现该需求,也没有安装 geoip ,所以也无法用模块来支持,只能原生的。

原始的 nginx 配置

</>复制代码

  1. upstream service_test {
  2. server 127.0.0.1:8080;
  3. }
  4. server
  5. {
  6. listen 80;
  7. server_name test.com;
  8. index index.html index.php;
  9. root /tmp/test.com;
  10. error_page 404 http://test.com/404.html;
  11. error_page 502 http://test.com/502.html;
  12. error_page 500 http://test.com/500.html;
  13. location ~* .(gif|jpg|jpeg|png|css|js|ico|txt|svg|woff|ttf|eot)$
  14. {
  15. rewrite ^(.*)$ /static$1 break;
  16. root /tmp/test.com; #
  17. expires 1d;
  18. }
  19. location ~* .(html|htm)$
  20. {
  21. rewrite ^(.*)$ /static$1 break;
  22. roo /tmp/test.com; #
  23. expires 900s;
  24. }
  25. location / {
  26. proxy_pass http://service_test;
  27. include /opt/conf/nginx/proxy.conf;
  28. }

修改后的 Nginx 配置

</>复制代码

  1. upstream service_test {
  2. server 127.0.0.1:8080;
  3. }
  4. server
  5. {
  6. listen 80;
  7. server_name test.com;
  8. index index.html index.php;
  9. root /tmp/test.com;
  10. error_page 404 http://test.com/404.html;
  11. error_page 502 http://test.com/502.html;
  12. error_page 500 http://test.com/500.html;
  13. location ~* .(gif|jpg|jpeg|png|css|js|ico|txt|svg|woff|ttf|eot)$
  14. {
  15. rewrite ^(.*)$ /static$1 break;
  16. root /tmp/test.com; #
  17. expires 1d;
  18. }
  19. location ~* .(html|htm)$
  20. {
  21. rewrite ^(.*)$ /static$1 break;
  22. roo /tmp/test.com; #
  23. expires 900s;
  24. }
  25. set $flag 0;
  26. if ($request_uri ~* "^/fuck/w+.html$") {
  27. set $flag "${flag}1";
  28. }
  29. if ($remote_addr !~* "192.168.0.50|192.168.0.51|192.168.0.56") {
  30. set $flag "${flag}2";
  31. }
  32. if ($flag = "012") {
  33. rewrite ^ /index.html permanent;
  34. }
  35. location / {
  36. proxy_pass http://service_test;
  37. include /opt/conf/nginx/proxy.conf;
  38. }
在实现需求的过程中出现的问题

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

</>复制代码

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

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

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

</>复制代码

  1. if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {
  2. proxy_pass http://test.com/fuck;
  3. }

正确的方式:

</>复制代码

  1. if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {
  2. proxy_pass http://test.com$request_uri;
  3. }

或是

</>复制代码

  1. if ($remote_addr ~* "192.168.0.50|192.168.0.51|192.168.0.56") {
  2. proxy_pass http://test.com;
  3. }

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

</>复制代码

  1. location /fund {
  2. if ($remote_addr !~* "192.168.0.50|192.168.0.51|192.168.0.56") {
  3. rewrite ^ /index.html permanent;
  4. }
  5. }

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

</>复制代码

  1. 注:各位有其他好的建议,欢迎探讨。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39095.html

相关文章

  • 前端nginx使用札记

    摘要:它是一个高性能的和反向代理服务器,同时也可以作为的代理服务器。如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用反向代理。 nginx是什么? nginx是俄罗斯人 Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的一个十分轻量级的HTTP服务器。它是一个高性能的HTTP和反向代理服务器,同时也可以作为IMAP/POP3/SMTP的代理服务器。ngi...

    tianren124 评论0 收藏0
  • Nginx 配置根据请求IP末段进行分流

    摘要:原文链接何晓东博客主要是参数中的判断的配置跳转,分流能减轻服务器的负载和压力,这种是一种非常常见的服务器部署架构。本条规则匹配完成后,终止匹配,不再匹配后面的规则。返回永久重定向,浏览器地址会显示跳转后的地址。 原文链接: 何晓东 博客 主要是 location 参数中的 if 判断的配置跳转,分流能减轻服务器的负载和压力,这种是一种非常常见的服务器部署架构。 根据 IP 最后一段的范...

    qingshanli1988 评论0 收藏0
  • Web前端必备-Nginx知识汇总

    摘要:安装简单配置简洁启动快速便捷支持热部署支持拥有高度模块化的设计。备注在版本之前,不能在中使用权重。不能与同时使用。当有服务器需要剔除,必须手动掉。表示把请求转发给连接数较少的后端服务器。表示当前的暂时不参与负载均衡。表示预留的备份机器。 本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发、Nodejs、Python、Lin...

    whatsns 评论0 收藏0
  • 前端培训-初级阶段-场景实战(2019-06-13)-Nginx代理正确食用方式

    摘要:前端最基础的就是。我这边预期准备进入中级阶段,中间还是会穿插一些实战。语法精确匹配,匹配成功,则停止搜索正则不能有嵌套的。指令会根据在配置文件中出现的顺序依次执行,可以使用来终止接下来的处理。如果以或者或者,则停止处理,立刻重定向。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTM...

    Harpsichord1207 评论0 收藏0
  • 前端培训-初级阶段-场景实战(2019-06-13)-Nginx代理正确食用方式

    摘要:前端最基础的就是。我这边预期准备进入中级阶段,中间还是会穿插一些实战。语法精确匹配,匹配成功,则停止搜索正则不能有嵌套的。指令会根据在配置文件中出现的顺序依次执行,可以使用来终止接下来的处理。如果以或者或者,则停止处理,立刻重定向。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTM...

    seanHai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<