zoukankan      html  css  js  c++  java
  • nginx的proxy_pass到$host的问题

    今天在配置一个location的时候,希望使用一个变量如$host来指示nginx代理:

    1. location /test/
    2. {
    3. proxy_pass http://$host;
    4. }

    如你想不到,这个配置是不能使用的,查看error.log,打出来的信息也无法帮助解决问题。
    但相同情况下,root标签就工作得很好:

    1. locatin /test/
    2. {
    3. root /dev/shm/$host;
    4. }

    令人匪夷所思,估计这是nginx的一个bug,或者是一个搅不清的逻辑?
    把上面的错误配置改成

    1. location /test/
    2. {
    3. proxy_pass http://$host/;
    4. }

    或者

    1. set $vhost "test.sudone.com";
    2. location /test/
    3. {
    4. proxy_pass http://$vhost;
    5. }

    等等,都不能解决问题,最后是用了个奇怪的配置方式,居然能工作……

    1. location /test/ {
    2. proxy_pass http://127.0.0.1:80;
    3. proxy_set_header Host $host;
    4. }

    这个配置就能工作正常,但上面这个配置只支持单ip的后端,能不能支持upstream呢?
    再改一下测测

    1. upstream backend.sudone.com
    2. {
    3. server 127.0.0.1:80;
    4. }
    1. location /test/
    2. {
    3. proxy_pass http://backend.sudone.com;#固定写的后端upstream
    4. proxy_set_header Host $host;#$host=test.sudone.com;
    5. }

    嗯?能用!
    有了这个办法,我便不用在数十个主机配置内把/test/这个location贴上数十次,另外,它也可以支持这样的写法:

    1. location /test/
    2. {
    3. proxy_pass http://127.0.0.1:80;
    4. proxy_set_header Host fetch.$host;
    5. }

    还可以用正则表达式对host进行匹配:

    1. set $vhost $host;
    2. if ($host ~* "([^.]+).92csz.com")
    3. {
    4. set $vhost $1.92csz.com;
    5. }
    6. location /test/
    7. {
    8. proxy_pass http://127.0.0.1:80;
    9. proxy_set_header Host fetch.$host;
    10. }

    可用的方面就广了。

    ---------------------------------------------------

    补充:

    在这个配置里,我的nginx代理的后端(backend)也是nginx,目前尚不清楚其它的web服务器如apache等是否能在这样的配置下工作正常。

  • 相关阅读:
    echarts官网上的动态加载数据bug被我解决。咳咳/。
    jquery中的jsonp和js中的jsonp还有配合php实现的jsonp。
    jquery中的done和always解决ajax问题
    vue2.0使用watch监听对象属性
    gulp配合vue压缩代码格式化
    支持flv的播放神器
    前端组件化-Web Components【转】
    自定义异步加载资源插件
    【leetcode刷题笔记】Two Sum
    【leetcode刷题笔记】Longest Common Prefix
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8308456.html
Copyright © 2011-2022 走看看