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。因此,就出現了如樓主所述的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM