Nginx는 www-prefixed 도메인에 비 www- 프리 픽스 도메인을 다시 작성합니다

StackOverflow https://stackoverflow.com/questions/1629231

  •  06-07-2019
  •  | 
  •  

문제

나는 nginx를 본다 httprewritemodule 문서 www-prefixed 도메인을 비 WWW- 준비된 도메인으로 다시 작성하는 예가 있습니다.

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1 contains '/foo', not 'www.mydomain.com/foo'
}

WWW-Prefixed 도메인에 비 www- 프리 픽스 도메인을 다시 작성하려면 어떻게해야합니까? 나는 아마도 다음과 같은 일을 할 수 있다고 생각했지만 Nginx는 중첩 된 if 문을 좋아하지 않습니다.

if ($host !~* ^www\.) {                       # check if host doesn't start with www.
    if ($host ~* ([a-z0-9]+\.[a-z0-9]+)) {    # check host is of the form xxx.xxx (i.e. no subdomain)
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }
}

또한 Nginx에게 domain1.com-> www.domain1.com, domain2.com-> www.domain2.com 등을 다시 작성하도록 명시 적으로 알려주지 않고 도메인 이름에 대해 작동하기를 원했습니다. .

도움이 되었습니까?

해결책 3

글쎄, 나는 어쨌든 xxx.xxx 양식의 도메인 만 확인하고 있기 때문에 바깥 "if"문을 실제로 필요로하지 않는다고 생각합니다. 강력하지는 않지만 다음은 저에게 효과가 있습니다. 더 나은 솔루션이 있는지 알려주세요.

    if ($host ~* ^([a-z0-9\-]+\.(com|net|org))$) {
        set $host_with_www www.$1;
        rewrite ^(.*)$ http://$host_with_www$1 permanent;
    }

편집 : 호스트 이름의 유효한 문자이므로 정규 표현식에 하이픈을 추가했습니다.

다른 팁

Nginx 문서에 언급 된 바와 같이, 당신은 if 가능한 경우 nginx의 지침, 당신이있는 즉시 if 구성에서 서버는 모든 단일 요청을 평가하여 일치할지 여부를 결정해야합니다. if 아니면 아니에요.

더 나은 솔루션은 여러 서버 지시문입니다.

server {
        listen 80;
        server_name website.com;
        return 301 $scheme://www.website.com$request_uri;
}

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

SSL (HTTPS) 활성화 된 사이트를 제공하려는 경우 세 가지 옵션이 다소 가득합니다.

  1. 각 서버 디렉토리가 자체 IP (또는 다른 포트가 옵션 인 경우 다른 포트)가있는 여러 IP 주소를 설정하십시오. 이 옵션에는 두 가지 모두에 대한 SSL 인증서가 필요합니다 웹 사이트.com 그리고 www.website.com, 와일드 카드 인증서, UNI 인증서 (다중 도메인) 또는 두 개의 다른 인증서가 있습니다.
  2. 응용 프로그램에서 다시 작성하십시오.
  3. 두려운 것을 사용하십시오 if 지령.

SNI를 사용할 수있는 옵션도 있지만 지금은 이것이 완전히 지원되는지 확신하지 못합니다..

if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}
if ($host ~* ^[^.]+\.[^.]+$) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
}

요청이 서버에 적용되지 않기 때문에 유효한 호스트 이름을 얻을 수 있으므로 자체 유효성 검사 로직을 빌드 할 필요가 없습니다.

NGINX 문서는 IF 사용에 대한 사용에 대해주의를 기울입니다. 여기 링크를 참조하십시오 : http://wiki.nginx.org/pitfalls#server_name

IF 조건이없는 HTTP 및 HTTPS :

server {
    listen          80;
    listen          443;
    server_name     website.com;

    return 301 $scheme://www.website.com$request_uri;
}
server {
    listen          80;
    listen          443 default_server ssl;
    server_name     www.website.com;

    # Your config goes here #
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top