네트워크 외부에서 들어오는 모든 요청을 https로 리디렉션하고 싶지만 내부 요청은 http에 유지하고 싶습니다.
지금은 두 개의 파일이 있습니다 .conf
. 하나는 다음과 같이 시작됩니다.
server {
# listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
server_name www.example.com , example.com;
# omitted stuff
}
그리고 다음을 포함합니다
server {
listen 80;
server_name www.example.com , example.com;
return 301 https://$host$request_uri;
}
그리고 다음과 같이 시작하는 또 다른 것:
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
server_name "";
root /var/www/html;
# omitted stuff
}
하지만 지금은 다음을 요청합니다.http://example.comhttps로 리디렉션되지 않습니다.
왜 그런 겁니까? 내가 뭘 잘못했나? 내 목표는 홈 개인 네트워크( 192.168.1.*
)에서 오지 않는 모든 요청을 https로 리디렉션하고 내부 요청은 그대로 두는 것입니다.
답변1
server_name
지시문은 도메인 이름을 구분하기 위해 공백을 사용합니다. 구성에 nginx를 혼동시키는 쉼표가 있습니다.
다음을 사용해야 합니다.
server_name www.example.com example.com;
답변2
다음과 같이 로컬 네트워크의 두 인터페이스를 수신하는 다른 서버 블록을 만들려고 한다고 가정합니다.
server {
listen 192.168.1.144:80;
listen 192.168.1.196:80;
# ...
}
이것이 작동하려면 토폴로지는 다음과 유사합니다.
그러나 서버가 개인 네트워크의 클라이언트와 동일한 NAT를 사용하는 경우 192.168.1.0/24
이 server
블록은 외부 연결에도 사용됩니다. 이 토폴로지는 다음과 유사합니다.
후자의 경우 다음을 사용할 수 있습니다.ngx_http_geo_module클라이언트를 기반으로 로컬 네트워크를 분리하려면 다음을 수행하십시오.
geo $external {
default 1;
192.168.1.0/24 0;
}
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
if ($external) {
return 301 https://$server_name$request_uri;
}
}
그러나 보안 관점에서 이와 같이 내부 네트워크를 신뢰하는 것은 권장되지 않지만 모든 클라이언트에 대해 TLS를 동일하게 사용하는 것이 좋습니다. 로컬 네트워크에 접속하는 것만으로도 MitM 위치를 쉽게 얻을 수 있기 때문이다.
답변3
리디렉션을 위해 이것을 시도하고 내부의 경우 개인적으로 IP 주소로 서버 이름을 만드는 것을 선호합니다.
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/example.crt;
ssl_certificate_key /etc/ssl/example.key;
server_name example.com www.example.com;
location{
.......
}
}