2015-12-16 109 views
2

是否有可能只允許用戶輸入xxxxxx.com(虛構),因此他們應該進行DNS查找並連接。並阻止使用我的公共IP連接的用戶?Nginx反向代理,只允許來自主機名的連接而不是ip

配置:

server { 
listen 80; 
return 301 https://$host$request_uri; 
} 

server { 

listen 443; 
server_name xxxxxxx.com; 

ssl_certificate   /etc/nginx/ssl/server.crt; 
ssl_certificate_key  /etc/nginx/ssl/server.key; 

ssl on; 
ssl_session_cache builtin:1000 shared:SSL:10m; 
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
ssl_prefer_server_ciphers on; 

access_log   /var/log/nginx/jenkins.access.log; 

location/{ 

    proxy_set_header  Host $host; 
    proxy_set_header  X-Real-IP $remote_addr; 
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header  X-Forwarded-Proto $scheme; 

    # Fix the 「It appears that your reverse proxy set up is broken" error. 
    proxy_pass   http://10.0.11.32:80; 
    proxy_read_tenter code hereimeout 360; 

    proxy_redirect  http://10.0.11.32:80 https://xxxxxxx.com; 
} 
} 

回答

3

$http_host參數被設置爲Host請求頭的值。 nginx使用該值來選擇server塊。如果未找到server塊,則使用默認服務器,該服務器標記爲default_server或者是遇到的第一個server塊。見this documentation

要強制nginx只接受命名的請求,使用捕獲所有服務塊拒絕別的,例如:

server { 
    listen 80 default_server; 
    return 403; 
} 

server { 
    listen 80; 
    server_name www.example.com; 
    ... 
} 

通過SSL協議,這取決於你是否擁有SNI啓用。如果您未使用SNI,則所有SSL請求都會通過相同的server塊,在這種情況下,您需要使用if指令來測試$http_host值的值。有關詳細信息,請參見thisthis

相關問題