2017-01-02 39 views
0

我想用2個服務器模塊。 第一個是:如何在HTTP/2下的Nginx中使用server_name?

server { 
    listen 443 ssl http2 fastopen=3 reuseport; 
    server_name a.example.xyz; 
    include server_safe.conf; 
    root /home/www/blog/; 
    } 

二是:

server { 
    listen 443 ssl http2; 
    server_name b.example.xyz; 
    include server_safe.conf; 
} 

我想要什麼: 我想要的服務器名是有效的,也就是說,如果我用一個c.example.xyz訪問我的網站,無論是a.example.xyzb.example.xyzc.example.xyz是同一個IP,因爲它不是在server_name服務器應該阻止c.example.xyz請求。

不過,如果我進入https://c.example.xyz,Nginx的仍然會收到請求,並作爲效應初探a.example.xyz

我知道HTTP/2在其頭部沒有主機,它有一個:authority代替。

我的問題是:我怎麼能拒絕任何其他的要求嗎?我只想接受host(:authority) = = a(b).example.xyz

回答

2

問題是,如果沒有其他名稱匹配,問題是默認使用的第一個服務器塊。

因此達到你想要什麼,你需要另外兩個之前創建一個默認塊,,並將其阻止或重新定向,或顯示錯誤頁面。

這樣做的缺點是:

  1. 除非你有所有的域名(或使用覆蓋此通配符證書)HTTPS證書,那麼他們將得到一個錯誤去到https的版本時,您的網站並使用此默認配置。儘管無論如何這都會發生在你目前的設置之下。沒有辦法,據我所知之前發送塊消息的HTTPS談判發生。

  2. 不支持SNI(主要是Windows XP)的舊客戶端將進入默認配置,而之前它們將通過服務器A獲得,因爲它是默認設置(雖然不適用於服務器B)。

另一種方法是根據提供的主機名編寫重定向規則。不是100%確定如何在nginx上做到這一點誠實,但如果默認情況下不可能,那麼ModSecurity可能是可能的。再次將只需要後HTTPS的談判已經發生了所以還是給你留下一個潛在的不正確的證書問題影響

+0

你是正確的,根據你的答案,我創建了之前其他服務器塊'服務器名_'新的服務器模塊,使任何其他要求可給予404。當然,因爲它得到404的響應,它已經通過https協商。我的證書有SAN,我的nginx有SNI,所以證書不是問題。最後,非常感謝 – user3978288