原先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": "未授權"
}
wang_wei