Apacheサーバー–.htaccessでLocationディレクティブを使用しようとしています

Dec 10 2019

Webサイトで特定のパス(/ foo / bar /)が呼び出されたときに、すべてのキャッシュを削除する必要があります。私のマネージドホスティングサポートは、これを.htaccessで行う必要があることを教えてくれ、次のようにLocationディレクティブを使用しようとしました。

<Location "/foo/bar/">
  Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</Location>

しかし、私が得るのは内部サーバーエラーだけです。何かを省略しましたか、それともこのディレクティブを.htaccessの特定の場所に配置する必要がありますか。私は考えられるすべてを試しましたが、同じ結果になりました。

回答

2 MrWhite Dec 10 2019 at 19:08

すでに述べたように、<Location>ディレクティブは.htaccessファイルでは許可されていません。場合は/foo/bar/、ファイルシステムのディレクトリに直接関係、あなたが置くことができます.htaccess(ディレクティブ適用するために、そのディレクトリ内のファイルをHeaderこの場合は)そのディレクトリに、以下のみを。

ただし、/foo/bar/がURLパスのみ(<Location>サーバーコンテキストでディレクティブが対象とするもの)であり、ファイルシステムに直接関係しない場合は、代わりに、そのURlパスにアクセスするときに環境変数を設定し、Headerその環境変数が設定されているかどうかに条件付きで基づいています。

例えば:

SetEnvIf Request_URI "^/foo/bar/$" NO_CACHE
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" env=NO_CACHE

上記は、URLパス(のみ)が要求されたときにenv varをNO_CACHE(値に1)設定し/foo/bar/Headerディレクティブはそのenv varが(最後の引数によってenv=NO_CACHE)設定されたときにのみ適用されます。


または、Apache 2.4以降を使用している場合は、Apacheを使用して、そのURLパスのみを直接ターゲットにすることができ、env変数を設定する必要がなくなります。例えば:

<If "%{REQUEST_URI} =~ m#^/foo/bar/$#">
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</If>

別の方法として、Apache 2.4.10以降を使用している場合は、そのURLパスのみをターゲットにするために、ディレクティブで直接Apache式を使用できますHeader。例えば:

Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" "expr=%{REQUEST_URI} =~ m#^/foo/bar/$#"
Lacek Dec 10 2019 at 16:50

Apacheのドキュメントによると、このLocationディレクティブは.htaccessファイルではまったく使用できません。Locationサーバー構成で使用できますが、.htaccessファイルは常にファイルが存在する現在のディレクトリを参照するため、そのファイル内の別の場所にディレクティブを指定しても意味がありません。

Locationディレクティブを省略するだけで、Headerそれ自体がそのディレクトリ/場所で機能するはずです。