programing

Amazon 로드 밸런서 뒤에서 WordPress HTTPS 문제를 해결하는 방법

goodsources 2023. 3. 27. 21:12
반응형

Amazon 로드 밸런서 뒤에서 WordPress HTTPS 문제를 해결하는 방법

전에도 이런 일이 있었어요.Amazon의 EC2 로드 밸런서에서 WordPress(또는 기타 PHP 스크립트)를 실행할 때 스크립트가 https:// 프로토콜로 실행 중인지 인식하지 못하고 끝없는 리디렉션 루프 및 HTTPS 경고("이 페이지의 일부 컨텐츠가 안전하지 않은 방식으로 요청됨)와 같은 문제가 발생합니다..").

여기에서 솔루션을 찾았는데 WordPress core를 수정해야 합니다.업데이트에는 도움이 되지 않습니다.https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless-redirect

WordPress core를 수정하지 않고 수정할 수 있는 방법이 있습니까?Apache 2.2를 사용하고 있습니다.

WordPress의 경우 링크와 마찬가지로 문제가 있습니다.is_ssl()이 함수는 대부분의 PHP 소프트웨어가 명시적으로 체크하는 것과 같습니다.$_SERVER['HTTPS']그리고.$_SERVER['SERVER_PORT']https:// 컨텍스트에서 현재 페이지에 액세스하고 있는지 여부를 확인합니다.

HTTPS를 통해 페이지에 액세스하지만 Amazon 로드 밸런서가 SSL 오프로드를 수행하고 실제로 SSL이 아닌 포트 80에서 컨텐츠를 요청하면 웹 서버, PHP 또는 이와 관련된 다른 모든 항목이 해당 페이지에 액세스하고 있는지 이해하지 못하거나 https://를 통해 액세스하고 있는지 확인할 수 없습니다.

이에 대한 수정은 Amazon의 ELB가 사실상의 표준을 보내는 것입니다.X-Forwarded-ProtoHTTP 헤더: 클라이언트가 로드 밸런서의 반대편에서 실제로 사용하고 있는 프로토콜을 파악하는 데 사용할 수 있습니다.

Apache 2.2에서는 다음과 같은 기능을 사용할 수 있습니다.

<IfModule mod_setenvif.c>
  SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>

간단히 말하면X-Forwarded-Protoheader를 클릭합니다.이 값이 같은 경우https그 다음에HTTPS환경변수는 다음과 같이 설정됩니다.1PHP는 이 환경변수를 인식하게 되며, 결국 이 환경변수는$_SERVER['HTTPS']그것은 동등하다1-- 「실제」네이티브 SSL 요구와 같은 것입니다.

WordPress 문서의 또 다른 옵션은 이를 wp-config에 추가하는 것입니다.php:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

이와 동등한 Nginx를 찾고 있는 다른 사용자가 있을 경우 다음과 같이 하십시오.

재작성 셋업의 경우 다음 항목을 아래에 추가해야 합니다.server블록:

if ($http_x_forwarded_proto != 'https') {
    rewrite ^ https://$host$request_uri? permanent;
}

HTTPS 파라미터를 설정하려면 , 다음의 항목을 추가할 필요가 있습니다.location ~ \.php$블록:

if ($http_x_forwarded_proto = 'https') {
    set $fe_https 'on';
}
fastcgi_param HTTPS $fe_https;

다른 것은 반드시 삭제해 주세요.fastcgi_param HTTPS명령어(제 안에 있습니다)fastcgi_params을 클릭합니다.

이 4단계 방법을 사용하여 WordPress에서 ssl을 사용할 때 리다이렉트 루프 및 혼합 콘텐츠 문제를 제거합니다.

1) 데이터베이스의 'http://'를 '//'로 바꿉니다.이미지 및 기타 자산의 모든 상대 URL이 생성됩니다.

2) wp-config에서 범용 wp_home 변수와 wp_siteurl 변수를 정의합니다.

define('WP_HOME','//'. $_SERVER['SERVER_NAME']);
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']);

3) 로드 밸런서를 사용하고 있는 경우는, 「」를 사용합니다.HTTP_X_FORWARDED_PROTO' 서버 변수.이를 수행하려면 이 행을 wp-config에 추가합니다.

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

4) 마지막으로 .htaccess에서 loadbalancer 뒤에 있는 경우 이 행을 사용하여 모든 트래픽을 https로 수정합니다.

 # http to https
 RewriteCond %{HTTP:X-Forwarded-Proto} =http
 RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

유감스럽게도 위의 두 가지 오류 모두 혼합 콘텐츠 오류를 해결하지 못했습니다.그러나 효과가 있었던 것은 wp-config의 WP_HOME &&WP_SITEURL 변수에 프로토콜을 추가하는 것이었다.php 예:

define( 'WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define( 'WP_SITEURL', WP_HOME );

그 후 소스 내의 모든 URL이 https로 시작되어 혼합 콘텐츠오류가 모두 사라졌습니다.

Server 는 다음과 같습니다.Ubuntu 20.04.3 LTS, PHP 8.0.11, nginx/1.18.0

의 다음 /etc/nginx/sites-available/default: 작업 완료:

server {

    listen 80;
    listen [::]:80;
    root /var/www/html;
    index  index.php index.html index.htm;
    server_name ChangeDomainName.com www.ChangeDomainName.com;

    if ($http_x_forwarded_proto != 'https') {
        rewrite ^ https://$host$request_uri? permanent;
    }

    location / {
            try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.0-fpm.sock;
            if ($http_x_forwarded_proto = 'https') {
                set $fe_https 'on';
            }
            fastcgi_param HTTPS $fe_https;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

언급URL : https://stackoverflow.com/questions/30702490/how-to-fix-wordpress-https-issues-when-behind-an-amazon-load-balancer

반응형