Nginx는 www-prefixed 도메인에 비 www- 프리 픽스 도메인을 다시 작성합니다
-
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) 활성화 된 사이트를 제공하려는 경우 세 가지 옵션이 다소 가득합니다.
- 각 서버 디렉토리가 자체 IP (또는 다른 포트가 옵션 인 경우 다른 포트)가있는 여러 IP 주소를 설정하십시오. 이 옵션에는 두 가지 모두에 대한 SSL 인증서가 필요합니다 웹 사이트.com 그리고 www.website.com, 와일드 카드 인증서, UNI 인증서 (다중 도메인) 또는 두 개의 다른 인증서가 있습니다.
- 응용 프로그램에서 다시 작성하십시오.
- 두려운 것을 사용하십시오
if
지령.
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 #
}