zoukankan      html  css  js  c++  java
  • nginx配置时server_name配的不一样还能正常访问

     

    原先server_name 配的是api.test.toutiao.applet.rockysaas.com,监听的是80端口,http。后来域名改成了api-test.tbk.rockysaas.com,监听443,https。但是发现原先的api.test.toutiao.applet.rockysaas.com还能访问。

    server {
    #    listen       80;
            listen 443 ssl;
    
            ssl_certificate /usr/local/webserver/nginx/conf/ca/3519907_api-test.tbk.rockysaas.com.pem;
            ssl_certificate_key /usr/local/webserver/nginx/conf/ca/3519907_api-test.tbk.rockysaas.com.key;
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
    
            server_name api-test.tbk.rockysaas.com;
        access_log  /var/log/nginx/tbk.api.access.log  main;
    
    
            index index.html;
              location /tbk {
               #请求头数据大小设置
             client_max_body_size 32m;
               client_body_buffer_size 8192k;
              proxy_send_timeout 300;
              proxy_read_timeout 300;
    
              #tomcat返回数据大小设置
             proxy_buffer_size 128k;
             proxy_buffers 32 32k;
             proxy_busy_buffers_size 128k;
              proxy_temp_file_write_size 256k;
              proxy_connect_timeout 300s;
              proxy_pass http://localhost:8238/tbk;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       }
    
    }

    后来在网上看到

    如果nginx中只配置一个server域的话,则nginx是不会去进行server_name的匹配的。因为只有一个server域,也就是这有一个虚拟主机,那么肯定是发送到该nginx的所有请求均是要转发到这一个域的,即便做一次匹配也是没有用的。还不如干脆直接就省了。如果一个http域的server域有多个,nginx才会根据$hostname去匹配server_name进而把请求转发到匹配的server域中。此时的匹配会按照匹配的优先级进行,一旦匹配成功进不会再进行匹配,关于具体的匹配规则可以参见nginx官网提供的文档。
     评论 (2)  引用此答案  举报
    wang_wei 2013/03/13 11:45
    实际上,nginx会匹配请求头中的host和server_name,如果没有匹配的上,nginx会指定该请求到一个默认的server域,如果比较说明,默认的server为第一个server。因此,就出现了如楼主所述的情况。

    可能是配443端口的server只有两个,然后访问https://api-test.tbk.rockysaas.com时默认就跑到这里来了。访问http://api-test.tbk.rockysaas.com时返回的是

    {
        "code": 1010,
        "message": "未授权"
    }
    如果nginx中只配置一个server域的话,则nginx是不会去进行server_name的匹配的。因为只有一个server域,也就是这有一个虚拟主机,那么肯定是发送到该nginx的所有请求均是要转发到这一个域的,即便做一次匹配也是没有用的。还不如干脆直接就省了。如果一个http域的server域有多个,nginx才会根据$hostname去匹配server_name进而把请求转发到匹配的server域中。此时的匹配会按照匹配的优先级进行,一旦匹配成功进不会再进行匹配,关于具体的匹配规则可以参见nginx官网提供的文档。
    W
    wang_wei 
    实际上,nginx会匹配请求头中的host和server_name,如果没有匹配的上,nginx会指定该请求到一个默认的server域,如果比较说明,默认的server为第一个server。因此,就出现了如楼主所述的情况。
    喜欢艺术的码农
  • 相关阅读:
    html调用applet
    WindowListener中的windowClosed方法不执行的问题。
    有理数类 Java BigInteger实现
    有理数类 Java
    BigInteger构造函数解析
    求最大公约数(辗转相除法)
    Java 十六进制转十进制
    Java 十进制转十六进制
    ORA-12520: TNS:listener could not find available handler for requested type of server
    关于 error: Operation is not valid due to the current state of the object。
  • 原文地址:https://www.cnblogs.com/zjhgx/p/12381764.html
Copyright © 2011-2022 走看看