Server Apache - mencoba menggunakan petunjuk Lokasi di .htaccess

Dec 10 2019

Saya perlu menghapus semua caching ketika jalur tertentu (/ foo / bar /) dipanggil di situs web saya. Dukungan hosting terkelola saya memberi tahu saya bahwa saya harus melakukan ini di .htaccess dan saya telah mencoba menggunakan petunjuk Lokasi, seperti:

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

Tapi yang saya dapatkan hanyalah kesalahan server internal. Apakah saya meninggalkan sesuatu atau haruskah arahan ini ditempatkan di tempat tertentu di .htaccess. Saya telah mencoba semua yang dapat saya pikirkan, dengan hasil yang sama.

Jawaban

2 MrWhite Dec 10 2019 at 19:08

Seperti yang telah disebutkan, <Location>arahan tidak diizinkan dalam .htaccessfile. Jika /foo/bar/berhubungan langsung dengan direktori sistem file maka Anda dapat menempatkan .htaccessfile di direktori itu untuk menerapkan arahan ( Headerdalam hal ini) ke direktori itu dan di bawahnya saja.

Namun, jika /foo/bar/hanya jalur URL (yang juga merupakan <Location>target direktif dalam konteks server), yang tidak berhubungan langsung dengan sistem file, maka Anda dapat menyetel variabel lingkungan saat jalur URl itu diakses dan menyetel Headersecara kondisional berdasarkan apakah env var itu disetel.

Sebagai contoh:

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

Di atas menetapkan env var NO_CACHE(ke nilai 1) ketika URL-path /foo/bar/(hanya) diminta dan Headerdirektif kemudian hanya diterapkan ketika env var itu disetel (oleh argumen terakhir env=NO_CACHE).


Alternatifnya, jika Anda menggunakan Apache 2.4+, Anda dapat menggunakan ekspresi Apache untuk secara langsung menargetkan jalur URL itu saja, meniadakan kebutuhan untuk menyetel env var. Sebagai contoh:

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

Alternatif lain, jika Anda menggunakan Apache 2.4.10+ maka Anda dapat menggunakan ekspresi Apache langsung di Headerarahan untuk menargetkan jalur URL itu saja. Sebagai contoh:

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

Menurut dokumentasi Apache , Locationarahan tidak dapat digunakan dalam .htaccessfile sama sekali. Anda dapat menggunakan Locationkonfigurasi server, tetapi .htaccessfile tersebut selalu merujuk ke direktori saat ini di mana file tersebut berada, jadi menentukan arahan untuk lokasi lain di file itu tidak ada gunanya.

Cukup biarkan Locationdirektif keluar, Headeritu sendiri harus berfungsi untuk direktori / lokasi itu.