nginx server_name 와일드 카드 또는 catch-all


119

여러 웹 사이트를 제공하는 nginx 인스턴스가 실행 중입니다. 첫 번째는 서버의 IP 주소에 대한 상태 메시지입니다. 두 번째는 admin.domain.com. 이것들은 훌륭하게 작동합니다. 이제 다른 모든 도메인 요청이 단일로 이동하고 싶습니다. index.php많은 도메인과 하위 도메인이 있으며 모두 nginx 구성에 나열하는 것은 비현실적입니다.

지금까지 설정 server_name을 시도했지만 *잘못된 와일드 카드로 실패했습니다. *.*다른 서버 블록을 추가 할 때까지 작동 한 다음 충돌하는 것 같습니다.

다른 사이트가 정의 된 후 nginx에서 catch-all 서버 블록을 실행하는 방법이 있습니까?

NB 저는 스팸 발송자가 아닙니다. 유용한 콘텐츠가 포함 된 정품 사이트입니다. 데이터베이스의 동일한 CMS에 의해 구동됩니다!


1
이것을 기본 소스로 사용하는 것이 가장 좋습니다. nginx.org/en/docs/http/server_names.html
stephen

답변:


147

포괄 서버 블록에서 청취 옵션을 이것으로 변경하십시오. (추가 default_server) 이것은 (지정된 포트에서) 정의되지 않은 모든 연결을 취합니다.

listen       80  default_server;

파일이나 폴더가 존재하지 않는 경우 모든 것을 index.php로 푸시하려면;

try_files                       $uri /$uri /index.php;

완벽하게 작동했습니다. 감사합니다. server_name _;IP 주소의 상태 페이지에 사용할 수 없어서 지정해야 server_name x.x.x.x했지만 괜찮습니다!
Tak

1
추가 default_server가 현재 Ubuntu 14.04의 최신 버전 인 nginx 1.4.6에서 작동하지 않는 것 같습니다. 추가하면 configtest명령이 오류를 반환하고 서버를 다시 시작해도 작동하지 않습니다. nginx 1.6.2가있는 Debian jessie를 사용하여 서버에서 똑같은 구성을 시도했으며 완벽하게 작동합니다. 당신은 1.4.6에있어 경우에 따라서 ... 다른 버전을 시도
Nicomak

1
HTTPS에 대한 추가 정보 : default_server지시문은 해당 포트의 요청에 대해 SSL 핸드 셰이크를 처리 할 서버도 설정합니다. 따라서 서버 블록 A가 SSL을 처리하고 서버 B가 HTTPS에 대한 포괄 역할을하도록하려면 솔루션은 server_name ~^(.+)$서버 B 에 설정 하는 것입니다.
Luke

66

간단한 밑줄도 작동합니다.

server_name  _;

출처 : http://nginx.org/en/docs/http/server_names.html


2
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다.
Kmeixner

10
링크는 참조 용으로 제공됩니다. 위의 두 줄이 실제로 답입니다. 단순히 밑줄을 server_name의 값으로 넣으면 원하는 "모두 잡기"동작이 생성됩니다.
jp.gouigoux

55
이 대답은 사실이 아닙니다. 참조는 listen 80 default_server구성에 있지 않는 한 이것이 작동하지 않음을 분명히합니다 .
Beetle

5
이 문서 도 참조 하십시오 .
Beetle

2
문서를 오해했을 수도 있지만 "이 이름에 특별한 것은 없습니다. 실제 이름과 절대 교차하지 않는 수많은 잘못된 도메인 이름 중 하나 일뿐입니다."- "및"! @ # "과 같은 다른 잘못된 이름은 동등하게 사용됩니다. ". 그래서 _단지입니다 유효하지 않은 이름은?
Florian Klein

26

이것은 작동합니다 :

server_name ~^(.+)$

13
server_name ~.더 효율적인 것 같다
youfu은

2
이것은 나를 위해 일했습니다. 어떤 이유로 든 default_server를 작동시킬 수 없었고 다른 모든 가상 호스트를 재정의했습니다.
NeuroXc

11

나를 위해 어떻게 든 default_server가 작동하지 않는 것을 정의하십시오. 나는 그것을 해결했다

server_name ~^.*$

모두의 정규 표현식을 사용합니다.


더 높은 투표 옵션을 모두 시도했으며 이것이 유일하게 작동했습니다. 참고 : IP 주소 대 URL로 서버에 연결하려고합니다.
Mampersat

9

server지시어 1 개만

에서 의 Nginx listen문서

default_server 매개 변수 (있는 경우)는 서버가 지정된 주소 : 포트 쌍의 기본 서버가되도록합니다. 지시문에 default_server 매개 변수가없는 경우 address : port 쌍이있는 첫 번째 서버가이 쌍의 기본 서버가됩니다.

server지시문 이 하나만 있으면 모든 요청을 처리하므로 아무것도 설정할 필요가 없습니다.


여러 server지시어

모든 요청을 지정된 server지시문 과 일치 시키려면 default_server매개 변수를에 추가 하기 만하면 listenNginx는이 server지시문을 기본값으로 사용합니다 .

server {
    listen 80 default_server;
}

server_name _;

에서 의 Nginx 문서

포괄 서버 예제에서 이상한 이름 "_"을 볼 수 있습니다.

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

이 이름에는 특별한 것이 없으며 실제 이름과 절대 교차하지 않는 수많은 잘못된 도메인 이름 중 하나 일뿐입니다. "-"및 "! @ #"과 같은 다른 잘못된 이름도 동일하게 사용할 수 있습니다.

설정 한 내용은 중요하지 않으며 잘못된 도메인 이름server_name 일뿐 입니다.



2

Host헤더 ( HTTP / 1.0 에서 허용됨)가 있는 요청도 포착 하려면 regex 및 empty 둘 다 사용할 수 있습니다 server_name.

server {
    listen      80;
    server_name ~. "";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.