Nginx : 위치 지시문에서 일치하는 서버 호스트 이름 실행하는 nginx가 있습니다. server {

단일 서버 지시문에서 여러 도메인을 실행하는 nginx가 있습니다.

server {
        listen       80;
        server_name  www.domain.com;
        server_name  x.domain.com;
        server_name  y.domain.com;

----
----
----
}

이제 위치 지정 문을 사용하여 하위 도메인을 일치시키고 기본 인증을 적용해야합니다. 동등한

location x.domain.com {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/.htpasswd;
}

어떻게해야합니까?



답변

정규식을 사용하여 하위 도메인을 캡처 한 다음 나중에 해당 위치에서 하위 도메인을 사용할 수 있습니다.

server {
    server_name   ~^(?<sub>\.)?(?<domain>.+)$;

    location / {
        root   /sites/$sub;
    }
}

또는 모든 공통 구성을 다른 파일로 이동 한 다음 서브 도메인 당 서버 블록을 작성하고 외부 파일을 포함시키는 것이 좋습니다.

server {
        server_name  www.domain.com;
        include /etc/nginx/sites-enabled/default.inc;

    location / {
        ...
    }
}

(다른 서버에 대해 반복)


답변

한 가지 옵션은 오류를 반환하고 해당 오류를 HTTP 인증을 처리하는 위치로 보내는 것입니다.

if ($host = x.domain.com) {
    return 550;
}

error_page 550 = @xauth;

location @xauth {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

답변

지도를 사용하는 경우 위치 지시문을 사용할 필요가 없습니다. 이것은 내가 생각할 수있는 가장 간단한 해결책과 동등한 것입니다. $ http_host에 따라 htpasswd 파일의 이름을 지정할 수 있습니다 (예 🙂 x.domain.com.htpasswd.

map $http_host $auth_type {
    default "off";               #This will turn off auth-basic
    x.domain.com "Restricted";   #This or any other string will turn it back on
}

server {
    auth_basic $auth_type;
    auth_basic_user_file /etc/nginx/conf.d/$http_host.htpasswd;
}

답변

여러 개의 (하위) 도메인이 있고 정확하게 동일 하게 작동하지 않으면 여러 서버 blcoks를 사용합니다. 죄송하지만 더 큰 구성을 사용하더라도 이것이 가장 좋은 방법입니다.

if ($ http_host ~ foo)와 같은 것을 사용하여 빈민굴 해킹을 할 수 있지만 다음과 같이 문서화 된 경우 예측할 수없고 이상한 행동을 무시할 가능성이 높습니다. http://wiki.nginx.org/IfIsEvil

Nginx보다 현명하지 말고 제공되는 옵션 만 사용하면 두통이 훨씬 줄어 듭니다.