2017-01-02 3 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를 사용하는 경우 server_name은, 즉, 유효하려면, 모두 a.example.xyz, b.example.xyz, c.example.xyz이 동일한 IP 인 경우 서버는 에 없기 때문에 c.example.xyz 요청을 차단해야합니다. 내가 https://c.example.xyz을 입력하면

는 그러나 Nginx에 여전히 내가 대신 :authority가, HTTP/2 헤더에는 호스트가 없습니다 알고 a.example.xyz

로 요청 및 reponse를 받게됩니다.

내 질문은 : 어떻게 다른 요청을 거부 할 수 있습니까? host(:authority) = a(b).example.xyz

답변

2

다른 이름이없는 경우 문제는 첫 번째 서버 블록이 기본적으로 사용됩니다.

따라서 원하는 것을 얻으려면 기본 블록 을 먼저 작성하고 다른 블록을 만들고 차단하거나 리디렉션하거나 오류 페이지를 표시해야합니다. 이것의

단점은 다음과 같습니다

  1. 모든 도메인 이름 (또는이 커버하는 와일드 카드 인증서를 사용) HTTPS 인증서가없는 한, 그 때 오류가 발생합니다 HTTPS의 버전으로 갈 때 귀하의 사이트 및 기본 구성을 사용하십시오. 비록 이것이 어쨌든 당신의 현재 상황 하에서 일어날지라도. AFAIK가 블록 메시지를 보내기 전에 전에 HTTPS 협상이 발생하는 방법은 없습니다.

  2. SNI (주로 Windows XP)를 지원하지 않는 이전 클라이언트는 기본 구성으로 이동하지만 이전에는 서버 A의 경우 기본 구성이므로 (서버 B는 아닐지라도) 통과하게됩니다.

다른 방법으로 제공된 호스트 이름을 기반으로 리디렉션 규칙을 작성하는 것입니다. nginx에서 정직하게 수행하는 방법을 100 % 확신하지는 않았지만 기본적으로 가능하지 않은 경우 ModSecurity를 ​​사용하여 가능합니다. 다시 이후에만 이 적용되며 HTTPS 협상이 발생하면 여전히 잘못된 cert 문제가 발생할 수 있습니다.

+0

답변에 따르면, 다른 서버 블록 앞에 'server_name _'이있는 새 서버 블록을 작성하여 다른 요청에 404를 제공 할 수 있습니다. 물론 404의 응답을 얻었으므로, https 협상을 진행했습니다. 내 인증서는 SAN을 가지고, 내 nginx SNI를 가지고 있으므로 인증서가 문제가되지 않습니다. 마침내 고마워. – user3978288