
내 Wordpress 사이트에 HSTS(HTTP Strict Transport Security)를 구현하려고 하는데 성공하지 못합니다. 먼저 내 사이트를 www가 아닌 사이트에서 https://를 포함하여 www로 리디렉션했지만 메시지를 받았습니다.https://hstspreload.org/먼저 www로 리디렉션해야 합니다.
VirtualHosts 구성 파일을 사용하려고 했는데 운이 없었습니다. 그래서 구글링을 좀 하다가 찾아낸이 링크htaccess를 사용한 솔루션처럼 보였지만 여전히 문제가 발생합니다. VirtualHost/Apache 구성 파일을 통해 이를 구현하는 방법을 아는 사람이 있다면 정말 좋을 것입니다.
오류: HTTP가 www로 먼저 리디렉션됩니다.
http://inter.net
(HTTP)는https://inter.net
www 하위 도메인을 추가하기 전에 즉시 (HTTPS)로 리디렉션되어야 합니다. 현재 첫 번째 리디렉션은 입니다https://www.inter.net/
. HSTS를 지원하는 모든 브라우저가 하위 도메인뿐만 아니라 최상위 도메인에 대한 HSTS 항목을 기록하도록 하려면 추가 리디렉션이 필요합니다.
내 htaccess는 다음과 같습니다.
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
#### This is what I added : From https://www.danielmorell.com/guides/htaccess-seo/redirects/https-www-and-trailing-slash
#### Force HTTPS://WWW and remove trailing / from files ####
## Turn on rewrite engine
RewriteEngine on
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.inter.net/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://www.inter.net/$1/ [R=301,L]
# Force HTTPS and WWW
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [OR,NC]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://www.inter.net/$1 [R=301,L]
# Yoast SEO - XML Sitemap Rewrite Fix
RewriteEngine On
RewriteBase /
RewriteRule ^sitemap_index.xml$ /index.php?sitemap=1 [L]
RewriteRule ^locations.kml$ /index.php?sitemap=wpseo_local_kml [L]
RewriteRule ^geo_sitemap.xml$ /index.php?sitemap=geo [L]
RewriteRule ^([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 [L]
RewriteRule ^([a-z]+)?-?sitemap.xsl$ /index.php?yoast-sitemap-xsl=$1 [L]
# END Yoast SEO - XML Sitemap Rewrite Fix
ps - inter.net URL은 단지 예일 뿐입니다.
편집 - 아래 답변에 MrWhite가 제공한 추가 규칙을 추가하기 위해 example.com.conf 파일을 편집했습니다. 이는 정확해 보입니다. 명령을 실행한 후 apachectl configtest
Syntaw는 정상이었습니다. service apache2 reload
변경 사항을 적용하기 위해 실행했으며 모든 브라우저에서 페이지가 제대로 리디렉션되지 않는다는 메시지를 받았습니다. **ERR_TOO_MANY_REDIRECTS**
(각각의 브라우저에 대해 매번 캐시를 지웠습니다).
htaccess를 원래 Wordpress 및 Yoast SEO 규칙으로 되돌렸습니다.
이 VirtualHost에 대한 Apache의 현재 구성 파일에 문제가 있을 수 있지만 apachectl configtest에는 구문 오류가 없습니다.https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK
추가 정보를 이해할 수 있는지 확인하기 위해 Firefox 개발자 모듈(F12)을 사용하려고 했는데 문제는 301 리디렉션 루프인 것 같습니다.https://www.example.com
편집 2: @MrWhite 덕분에 ServerAlias
세부 사항이 불필요하고 루프의 원인이라는 것을 이해했습니다. 문제를 해결하고 그로부터 배웠습니다.
답변1
요약하면 HSTS의 주요 요구 사항은 다음과 같습니다.
HTTP에서 HTTPS로 리디렉션동일한 호스트에서. 즉.
http://example.com
에게https://example.com
그리고http://www.example.com
에게https://www.example.com
HTTPS에서만 표준 호스트 이름(www 또는 www가 아닌)으로 리디렉션합니다. (즉, 위의 #1 이후)
Strict-Transport-Security
HTTPS에서만 (STS) HTTP 응답 헤더를 보냅니다 . 표준 리디렉션(위의 #2)을 포함합니다.(여러 소스에서 STS 헤더가오직HTTPS를 통해 전송되고 일반 HTTP를 통해 전송하는 것은 완전히 유효하지 않습니다. 저는 이것이 사실이라고 생각하지 않습니다.사양UA는 HTTP를 통해 전송될 때 이 헤더를 무시해야 한다고 명시하고 있으므로 이를 HTTP를 통해 전송하는 것도 "문제"가 아닙니다. 하지만 이것을 HTTPS로만 보내는 것은 별 일이 아니기 때문에 아래에서 구현했습니다.)
따라서 위의 #1을 위반할 수 있으므로 단일 리디렉션으로 요청(HTTP/HTTPS/www/비www)을 반드시 정규화할 수는 없습니다.
또한 게시한 코드에 STS 헤더를 설정하지 않은 것 같습니다. Apache(서버 구성 또는 )에서 리디렉션을 구현하는 경우 .htaccess
WordPress를 사용하여 이 헤더를 설정할 수 없습니다. 그렇게 하고 있다면?
인터넷 검색을 하다가 htaccess를 사용한 솔루션처럼 보이는 이 링크를 찾았습니다.
해당 "솔루션"은 HSTS를 구현하지 않습니다. 해당 문서의 유일한 목적은 단일 리디렉션으로 요청을 표준화하는 것입니다. 해당 기사 상단의 "경고"는 HSTS를 위반함을 명시적으로 알려줍니다.
또한 지시어를 잘못된 순서로 배치했습니다. 이러한 "리디렉션" 지시어는 사라져야 합니다.~ 전에그렇지 않으면 단순히 WordPress에 대해 처리되지 않을 것입니다.가상URL.
귀하의 정식 호스트 이름은 www.example.com
. (질문 제목에 www가 아닌 곳으로의 리디렉션을 언급했지만 질문의 나머지 부분에서는 www로 리디렉션하고 있습니까?)
VirtualHosts 구성 파일을 사용하려고 했는데 운이 없었습니다.
서버 구성에서 이를 구현하는 것이 더 간단하고 오류가 발생할 가능성이 적으며 더 효율적이지만(별도의 VirtualHosts 사용)
예를 들어("기타" 필수 지시어 생략):
<VirtualHost *:80>
ServerName example.com
# Redirect to HTTPS - same host
Redirect 301 / https://example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
# Redirect to HTTPS - same host
Redirect 301 / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
# Redirect to canonical host (HTTPS only)
Redirect 301 / https://www.example.com/
# SSL directives...
# Set STS header on the HTTPS redirect ("always" argument is required for this)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
<VirtualHost *:443>
# Canonical host
ServerName www.example.com
# SSL directives...
# etc.
# Set STS header on the HTTPS response
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
위의 STS 헤더는 max-age
1개월 동안만 매개변수를 설정하고 매개 preload
변수를 포함하지 않는다는 점에 유의하세요. 의도한 경우 HSTS 사전 로드 목록의 "배포 요구 사항"에 제공된 지침을 따르십시오.https://hstspreload.org/#deployment-recommendations
대안으로, 이를 구현하려면.htaccess
(주의: "후행 슬래시" 리디렉션을 구현하지 않았습니다. 요구 사항에서 이를 언급하지 않았고 단순히 외부 기사에서 복사한 코드의 일부일 뿐이기 때문입니다.
# Set HSTS env var only if HTTPS
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=HSTS:1]
# Redirect HTTP to HTTPS on the same host
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Redirect non-www to www (HTTPS only)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Set HSTS header conditionally if request is over HTTPS only (based on HSTS env var)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains" env=HSTS
# Yoast SEO - XML Sitemap Rewrite Fix
# : (directives go here...)
# END Yoast SEO - XML Sitemap Rewrite Fix
# BEGIN WordPress
# : (directives go here...)
# END WordPress
헤더가 200 OK가 아닌 응답에 설정되도록 지시문 에 조건 always
이 필요합니다 . Header
즉. www가 아닌 곳에서 www로 HTTPS 301 리디렉션을 설정해야 합니다.
또한보십시오내 대답HSTS 구현에 관한 CodeReview SE의 다음 질문에 .htaccess
: