Nginx: https://를 http://로 다시 작성

Nginx: https://를 http://로 다시 작성

https://Nginx가 내 서버 접두어가 붙은 사이트에 들어오는 요청을 다시 쓰도록 하려고 합니다. http://(이 사이트에서 사용되는 CMS가 상대 경로 대신 URI를 강제하기 때문입니다. 본질적으로 이미지, 스크립트 및 스타일시트를 만들어 전체 사이트를 손상시킵니다. 없는).

현재 전임자가 제시한 기존 지시문을 개조하려고 노력하고 있지만 Nginx 구성 구문에 대한 지식이 부족하다는 것을 알게 되었습니다. 코드는 다음과 같습니다.

if ($ssl_protocol = "") {
    rewrite ^   https://$http_host$request_uri? permanent;
}

http://현재 to 의 강제 재작성을 방지하기 위해 이 코드를 주석 처리했지만 https://사이트를 손상시키지 않고는 프로세스를 되돌릴 수 없습니다. 지금까지 시도한 내용은 다음과 같습니다.

if ($ssl_protocol = "https") {
    rewrite ^   http://$http_host$request_uri? permanent;
}

그리고

# also tried ($ssl_protocol != "")
if (!($ssl_protocol = "")) {
    rewrite ^   http://$http_host$request_uri? permanent;
}

첫 번째는 효과가 없는 것 같습니다. 클라이언트에 전송된 HTML은 여전히 ​​다시 작성되지 않는 HTTPS 요청을 만듭니다.

두 번째 스니펫도 아무런 효과가 없는 것 같습니다. 제가 올바르게 이해했다면(여전히 다소 놀랐지만) Nginx는 부울 부정을 지원하지 않습니다.

이를 수행하는 가장 좋은 방법(또는 작동하는 방법)은 무엇입니까?

편집하다:@NathanC의 답변에서 코드를 추가해 보았습니다. 그러나 이 무조건적인 다시 쓰기로 인해 리디렉션 루프가 발생합니다. 도움을 주시면 감사하겠습니다.

답변1

더 깨끗한 방법은 다음과 같습니다.

if ( $scheme = "https" ) {
    return 301 http://example.com$request_uri

또는 그것과 Nathans의 답변 사이 어딘가에 기본 SSL 서버 블록에는 단순히return 301 (SSL 블록이 무엇이든 구현 및 적응 방법을 확인하려면 자신의 블록을 자세히 살펴봐야 합니다)간단한 리디렉션을 위해 정규식을 수행할 필요가 없습니다.

return-http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

$https편집: 방금 if 문에서 대신 사용할 수 있는 변수가 있다는 것을 알았습니다 ." "https가 아닌 경우 반환:

if ( $https = "on" ) {
    ...

변경 사항을 테스트하는 동안 한 시간 전에 수정했지만 변경 사항이 브라우저에 반영되지 않은 경우 머리 당기는 것을 방지하기 위해 영구 302리디렉션 대신 임시 리디렉션을 사용해야 합니다 . :)301

답변2

다음과 같이 모든 https 트래픽을 강제로 http로 전환할 수 있으므로 이것이 필요하지 않습니다.

server {
        listen 443;
        ssl on;
        server_name example.com;
        rewrite ^(.*) http://example.com$1 permanent;
 }

참조:https://stackoverflow.com/questions/3470290/nginx-redirect-https-to-http

관련 정보