.htaccessの推奨事項

Oct 05 2020

私は主に楽しみのために使用される個人のウェブサイトを持っています。共有したい画像、動画、テキストをアップロードします。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と、ホワイト氏が推奨した多くの変更を統合した新しい投稿を作成しました。賞金が授与されました。それ以上のフィードバックは新しい投稿に送ってください。

回答

4 MrWhite Oct 15 2020 at 23:17

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を実装する意図がない場合は、最初の2つのリダイレクトを1つに組み合わせることができます。これは、最初の2つのルールの順序を逆にするだけで実行できます。例えば:

#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にリダイレクトするため、2番目のリダイレクトも実行する必要はありません。したがって、HTTPSと非wwwを正規化するためのリダイレクトは1つだけです。

また、代わりにサーバー変数を使用しているため(.*)、「HTTPからHTTPS」RewriteRule パターンの冗長なキャプチャサブパターン(つまり)を削除しましたREQUEST_URI。そして、他の「wwwから非www」リダイレクトを一貫性のあるものに変更しました。REQUEST_URIサーバー変数にはスラッシュプレフィックスを含む完全なURLパスが含まれているのに対し、キャプチャされた後方参照ではスラッシュプレフィックスが省略されていることに注意してください。

上記の2つのルールを組み合わせて、1つの(わずかに複雑な)ルールにすることもできますが、そうしてもメリットはありません。

正規のホスト名を明示的に指定しなくても、ルールをより「一般的」にすることもできます。ただし、これをどのように実装するか、およびこれが簡単に可能かどうかは、他のサブドメインがあるかどうかによって異なります。しかし、繰り返しになりますが、これは、よりコピー/貼り付け可能であることを除いて、「利点」にはなりません。一般に、ここでは明示的であることが望ましいです-エラーが発生しにくいです。

#URL EXTENSION REMOVAL
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]

このリダイレクトを最初に(上記の2つの正規リダイレクトの前に)含め、リダイレクトの一部としてHTTPSおよび非www(正規スキーム+ホスト名)に直接リダイレクトすることで、.html「拡張機能削除リダイレクト」が追加のリダイレクトをトリガーしないようにすることもできます。

更新:これも、現在の302(一時的)リダイレクトではなく、301(永続的)リダイレクトである必要があります。301リダイレクトはデフォルトでブラウザによってキャッシュされるため、サーバーへの不要なラウンドトリップを回避できます。Rフラグにステータスコードを明示的に含めない場合、デフォルトで302になります。

NCフラグも上必要とされていないRewriteRuleあなたは、大文字と小文字が区別され、ここでは何も一致していないので、ディレクティブ。

.html拡張子を削除するこのルールは、おそらくURLに対しては問題なく機能しますが、必ずしも正しいとは限らず、より効率的になる可能性があります。パターンやサーバー変数ではTHE_REQUESTなく、サーバー変数をチェックする理由は、書き換えられた要求がリダイレクトされないようにすることで、潜在的なリダイレクトループを回避するためです。これは、リクエストが書き換えられた後も変更されないためです。HTTPリクエストヘッダーの最初の行が含まれています。ただし、クエリ文字列も含まれているため、クエリ文字列の一部として含まれている正当なリクエストが誤ってリダイレクトされる可能性があります。RewriteRule REQUEST_URITHE_REQUESTTHE_REQUEST.html

たとえば、リクエストexample.com/?p1=foo.html&p2=bar(クエリ文字列と値を含むURLパラメータを含むホームページfoo.html)を指定すると、これは誤ってにリダイレクトされexample.com/?p1=foo、クエリ文字列が切り捨てられます。

また、正規表現/([^.]+)\.htmlは、ファイル拡張子以外の場所でURLパスの一部としてドットを含むURLと一致しません。例えば。のリクエストは/foo.bar.htmlリダイレクトされません。これはあなたのサイトのURLにとっては完全にOKかもしれませんが。

これらの「誤った」リダイレクトを回避するには、代わりに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)の両方からのリダイレクトを混在させないようにする必要があります。2つのモジュールは、.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>

ただしOrder、Apache 2.4を使用してAllowおりDeny、Apache 2.2ディレクティブであり、以前はApache2.4で非推奨であるとコメントで述べました。これらは引き続き機能しますが、下位互換性のためにのみ使用され、すぐに更新する必要があります。

新しいディレクティブは必ずしもうまく混合されないため、システム上のすべてのインスタンスを更新する必要があることに注意してください。

Apache 2.4Requireでは、代わりにディレクティブを使用します。

#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>