.htaccess 권장 사항
주로 재미로 사용되는 개인 웹 사이트가 있습니다. 공유하고 싶은 이미지, 동영상, 텍스트를 업로드합니다. HTML 제출 양식은 phpmyadmin저장을 위해 데이터베이스 테이블을 사용하는 사용자의 질문 및 문자열 제출을 수락 합니다.
아래 스 니펫은 내 현재 .htaccess파일입니다.https://gtmetrix.com/ 리디렉션이 내 페이지로드 속도를 늦추는 가장 큰 원인이라는 점에 유의하지만이를 간소화하는 방법을 잘 모르겠습니다.
RewriteEngine On
#REDIRECT TO SECURE HTTPS CONNECTION
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #FORCE WWW TO NON-WWW RewriteCond %{HTTP_HOST} ^www.MYDOMAIN.com [NC] RewriteRule ^(.*)$ https://MYDOMAIN.com/$1 [L,R=301] #URL EXTENSION REMOVAL RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteRule ^ /%1 [NC,L,R] RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^ %{REQUEST_URI}.html [NC,L] #HOTLINKING PROTECTION #NOTE: having |html| and |htm| included prevented access of the site through browser search, so i removed them. RewriteCond %{HTTP_REFERER} !^https://(www\.)?MYDOMAIN\.com(/.*)*$ [NC]
RewriteCond %{HTTP_REFERER} !^$ RewriteRule \.(css|flv|gif|ico|jpe|jpeg|jpg|js|mp3|mp4|php|png|pdf|swf|txt)$ - [F]
#CONTENT SECURITY POLICY
<FilesMatch "\.(html|php)$"> Header set Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data: 'unsafe-inline'; media-src 'self' data: 'unsafe-inline'; connect-src 'self';" </FilesMatch> #REDIRECT FOR DATE PAGE Redirect /date /storage/date-202010 #REDIRECT FOR HOME PAGE Redirect /home / #CUSTOM ERROR PAGES ErrorDocument 400 /allerror.php ErrorDocument 401 /allerror.php ErrorDocument 403 /allerror.php ErrorDocument 404 /allerror.php ErrorDocument 405 /allerror.php ErrorDocument 408 /allerror.php ErrorDocument 500 /allerror.php ErrorDocument 502 /allerror.php ErrorDocument 504 /allerror.php #PREVENT DIRECTORY BROWSING Options All -Indexes #FILE CACHING #cache html and htm files for one day <FilesMatch "\.(html|htm)$">
Header set Cache-Control "max-age=43200"
</FilesMatch>
    #cache css, javascript and text files for one week
<FilesMatch "\.(js|css|txt)$"> Header set Cache-Control "max-age=604800" </FilesMatch> #cache flash and images for one month <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|mp4|png)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
    #disable cache for script files
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$"> Header unset Cache-Control </FilesMatch> #BLOCKS FILE TYPES FOR USERS <FilesMatch "\.(htaccess|htpasswd|ini|log|sh|inc|bak)$">
Order Allow,Deny
Deny from all
</FilesMatch>
 
    최신 정보
저는 HSTS와 White 씨가 추천 한 많은 변경 사항을 통합하는 새 게시물을 작성했습니다. 현상금이 수여되었습니다. 추가 피드백이 있으면 새 게시물로 보내주십시오 .
답변
https://gtmetrix.com/리디렉션이 내 페이지로드 속도를 늦추는 가장 큰 원인이라는 점
이와 관련하여 gtmetrix.com의 "제안"은 사이트 전체에 걸쳐 표준 URL * 1 에 이미 일관되게 연결되어 있고 다른 리디렉션이 없다고 가정 할 때 "잘못된"(또는 의미만큼 심각하지는 않음) 입니다. 귀하의 애플리케이션 코드). 이러한 리디렉션은 사이트 방문자의 첫 방문에서 "매우 적은 부분"에게만 영향을 미칠 가능성이 있습니다.
( * 1 표준 URL은 HTTPS + www가 아닌 + .html확장자 없음 )
.htaccess게시 한 코드 에 3 개의 외부 리디렉션이 있습니다.
#REDIRECT TO SECURE HTTPS CONNECTION RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] #FORCE WWW TO NON-WWW RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301] #URL EXTENSION REMOVAL RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteRule ^ /%1 [NC,L,R]
HSTS 를 구현 한 경우 www 하위 도메인을 정규화하기 전에 동일한 호스트의 HTTP에서 HTTPS로 리디렉션해야합니다. 위의 첫 번째 규칙에서 수행하는 작업입니다. 이것은 HSTS 및 "사전로드 목록"의 요구 사항입니다. 따라서이 시나리오에서는 최소 2 회의 리디렉션 (최악의 경우)을 피할 수 없습니다.
그러나 HSTS를 구현할 의도가없는 경우 처음 두 리디렉션을 하나로 결합 할 수 있습니다. 처음 두 규칙의 순서를 간단히 바꾸면됩니다. 예를 들면 :
#FORCE WWW TO NON-WWW
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
#REDIRECT TO SECURE HTTPS CONNECTION
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 
     www를 www가 아닌 것으로 리디렉션하는 첫 번째 규칙도 HTTPS로 리디렉션되므로 두 번째 리디렉션도 실행할 필요가 없습니다. 따라서 정규화 HTTPS 및 비 www에 대한 리디렉션은 단 1 개뿐입니다.
또한 서버 변수를 대신 사용하고 있기 때문에 (.*)"HTTP to HTTPS" RewriteRule 패턴 에서 중복 캡처 하위 패턴 (예 :)을 제거했습니다 REQUEST_URI. 그리고 다른 "www to non-www"리디렉션을 일관성있게 변경했습니다. 있습니다 REQUEST_URI캡처 역 참조가 슬래시 접두사를 생략 반면, 서버 변수, 슬래시 접두어를 포함하여 전체 URL 경로가 포함되어 있습니다.
위의 두 가지 규칙은 하나의 규칙 (약간 더 복잡한)으로 결합 될 수 있지만 그렇게해도 이점이 없습니다.
규칙은 또한 정식 호스트 이름을 명시 적으로 지정하지 않고도보다 "일반적"으로 만들 수 있습니다. 그러나이를 구현하는 방법과 이것이 쉽게 가능한지 여부는 다른 하위 도메인이 있는지 여부에 따라 다릅니다. 그러나 다시 말하지만 이것은 복사 / 붙여 넣기가 가능한 것 외에 "이점"을 제공하지 않습니다. 일반적으로 여기에서 명시 적으로 작성하는 것이 좋습니다. 오류가 발생하기 쉽지 않습니다.
#URL EXTENSION REMOVAL RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] RewriteRule ^ /%1 [NC,L,R]
또한 이 리디렉션을 먼저 포함하고 (위의 두 표준 리디렉션 이전에) 리디렉션의 일부로 HTTPS 및 비 www (표준 스키마 + 호스트 이름)로 직접 .html리디렉션 하여 '확장 프로그램 제거 리디렉션'이 추가 리디렉션 을 트리거 하지 않도록 할 수 있습니다 .
업데이트 : 이것은 현재 302 (임시) 리디렉션이 아닌 301 (영구) 리디렉션이어야합니다. 301 리디렉션은 기본적으로 브라우저에 의해 캐시되므로 서버로의 불필요한 왕복을 방지합니다. R플래그 와 함께 상태 코드를 명시 적으로 포함하지 않으면 기본값은 302입니다.
NC플래그도 필요하지 않습니다 RewriteRule당신은 대소 문자를 구분 여기에 아무것도 일치하지 않기 때문에, 지시어.
.html확장 프로그램 을 제거하는이 규칙 은 URL에서 정상적으로 작동 할 수 있지만 반드시 정확하지는 않으며 더 효율적으로 만들 수 있습니다. 패턴 또는 서버 변수 THE_REQUEST와 반대로 서버 변수 를 확인하는 이유는 재 작성된 요청이 리디렉션되는 것을 방지하여 잠재적 인 리디렉션 루프를 방지하기위한 것입니다. 이는 요청이 다시 작성된 후에도 변경되지 않기 때문입니다. 여기에는 HTTP 요청 헤더의 첫 번째 줄이 포함됩니다. 그러나 쿼리 문자열도 포함하므로 쿼리 문자열의 일부로 포함 된 합법적 인 요청이 잘못 리디렉션 될 수 있습니다.RewriteRule REQUEST_URITHE_REQUESTTHE_REQUEST.html
예를 들어, request example.com/?p1=foo.html&p2=bar(쿼리 문자열이있는 홈페이지와 값 foo.html이 포함 된 URL 매개 변수 )는로 잘못 리디렉션되어 example.com/?p1=foo쿼리 문자열이 잘립니다.
정규식 /([^.]+)\.html은 또한 파일 확장자가 아닌 위치에서 URL 경로의 일부로 점을 포함하는 URL과 일치하지 않습니다. 예. 에 대한 요청은 /foo.bar.html리디렉션되지 않습니다. 사이트의 URL에 대해 완벽하게 괜찮을 수 있지만.
이러한 "잘못된"리디렉션을 방지하기 위해 대신 RewriteRule 패턴 에서 URL 경로를 캡처하고 더 간단한 조건을 사용 THE_REQUEST하고 루프를 방지하기 위해 검사 하거나 (루프를 방지하기 위해) REDIRECT_STATUS직접 요청에서 항상 비어 있는 환경 변수를 대신 사용할 수 있습니다.
예를 들면 :
#URL EXTENSION REMOVAL
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.html$ https://example.com/$1 [NC,R=301,L]
 
     이 캡처 URL 경로 전에.html 사용하여 파일 확장자 RewriteRule 패턴 (자연적으로 쿼리 문자열 제외). REDIRECT_STATUSenv var 를 확인하는 간단한 조건 은 리디렉션 루프를 방지합니다.
위의 사항을 종합하면 다음과 같습니다.
#URL EXTENSION REMOVAL
RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule (.+)\.html$ https://example.com/$1 [NC,R=301,L]
#FORCE WWW TO NON-WWW
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [L,R=301]
#REDIRECT TO SECURE HTTPS CONNECTION
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
 
     NC"URL 확장 제거"리디렉션 에는 플래그가 필요하지 않았습니다.
이제 요청이 HTTP, www 또는 .html확장을 포함하는지 여부에 관계없이 최대 1 개의 리디렉션을 트리거 합니다. 그러나 언급했듯이 이는 HSTS 요구 사항을 충족하지 못하는 비용으로 발생합니다.
그리고 실제로는 여기서 1, 2 또는 3 개의 리디렉션간에 인식 할 수있는 차이가 없을 수 있습니다. 특히 대다수의 방문자에게 영향을 미치지 않을 것이기 때문입니다.
추가 :
#REDIRECT FOR DATE PAGE Redirect /date /storage/date-202010 #REDIRECT FOR HOME PAGE Redirect /home /
일반적으로 mod_alias ( Redirect/ RedirectMatch) 및 mod_rewrite ( RewriteRule)의 리디렉션을 혼합하지 않아야합니다 . 두 모듈은 .htaccess파일 에있는 지시문의 명백한 순서에도 불구하고 요청 중에 서로 다른 시간에 독립적으로 실행 됩니다. mod_rewrite가 먼저 실행됩니다. 따라서 예기치 않은 충돌이 발생할 수 있습니다.
또한 Redirect접두사 일치이며 일치 후 모든 항목이 대상 URL의 끝에 추가됩니다. 예. 첫 번째 규칙 /date/foo에 /storage/date-202010/foo의해 리디렉션됩니다 . 이러한 특정 리디렉션도 302 (임시) 리디렉션입니다. 301 (영구)이어야하는 것 같습니까?
그러나이 경우에는 Redirect또는 을 사용하는지 여부는 중요하지 않지만 RewriteRule일반적으로 일부 리디렉션에 mod_rewrite를 사용하는 경우 모든 리디렉션에 mod_rewrite를 사용합니다. 예를 들면 :
#REDIRECT FOR DATE PAGE
RewriteRule ^date$ /storage/date-202010 [R=301,L]
#REDIRECT FOR HOME PAGE
RewriteRule ^home$ / [R=301,L]
 
     #BLOCKS FILE TYPES FOR USERS <FilesMatch "\.(htaccess|htpasswd|ini|log|sh|inc|bak)$"> Order Allow,Deny Deny from all </FilesMatch>
당신은 당신이 그러나, 아파치 2.4를 사용하고 있는지 의견 진술 Order, Allow그리고 Deny아파치 2.2 지시하고 이전에 아파치 2.4에서 사용되지 않습니다. 여전히 작동하지만 이전 버전과의 호환성을 위해서만 가능하며 즉시 업데이트해야합니다.
최신 지시문이 반드시 잘 혼합되지는 않으므로 시스템의 모든 인스턴스 를 업데이트해야합니다 .
Apache 2.4에서는 Require대신 지시문을 사용합니다.
#BLOCKS FILE TYPES FOR USERS
<FilesMatch "\.(ht[ap]|ini|log|sh|inc|bak)$">
Require all denied
</FilesMatch>
 
     Apache 서버 구성은 이미 .htaccess및 .htpasswd파일에 대한 직접 액세스를 "차단"해야 하지만 안전하다고 생각합니다.
ErrorDocument 500 /allerror.php
500 ErrorDocument 후기 를 정의하는 .htaccess것은 잘못된 구성으로 인해 발생하는 대부분의 500 (내부 서버 오류) 응답을 포착하기에는 너무 늦을 수 있습니다 . 이것에 대해 당신이 할 수있는 일이 많지 않을 것입니다. 그러나 더 "유용"하기 위해 서버 구성 (또는 컨테이너)에서 이것을 일찍 정의하는 것이 좋습니다 <VirtualHost>.