Bagaimana saya harus menggunakan arahan <If> di .htaccess?

16

Saya mencoba untuk menambahkan pernyataan kondisional menggunakan direktif If Apache dalam file .htaccess saya.

Saya telah mereferensikan halaman ini http://httpd.apache.org/docs/trunk/mod/core.html#jika tetapi tidak terlalu banyak menguraikan / memberikan banyak contoh. Dua contoh tidak lengkap yang diberikannya adalah:

<Jika% {REQUEST_METHOD} DALAM DAPATKAN, KEPALA, OPSI> 

dan

<Jika "$ req {Host} = ''"> 

Jadi saya sudah mencoba menambahkan ini ke file .htaccess saya:

<Jika% {SERVER_PORT} DALAM MENDAPATKAN, KEPALA, OPSI>
   # belum ada di sini
</If>

Tapi saya terus mendapatkan Kesalahan 500 ketika saya mencoba dan memuat halaman. Ini pada instalasi lokal saya, dan sebelumnya berfungsi dengan baik (atau jika saya menghapus kode itu). Saya percaya saya telah AllowOverride Allmengatur secara global, dan konteks untuk direktif If harus membiarkannya ada di .htaccess ("Konteks: konfigurasi server, virtual host, direktori, .htaccess").

Dapatkah seseorang memberi saya beberapa contoh tentang bagaimana menggunakan arahan <If> dengan benar, atau beberapa petunjuk mengapa itu tidak bekerja untuk saya?

Terima kasih!

cwd
sumber
1
Jika Anda mendapatkan 500 kesalahan, itu berarti bahwa Apache telah mencatat sesuatu ke log kesalahan Anda. Apa yang dikatakan? Selain itu, pengujian Anda untuk SERVER_PORTmasuk GET,HEAD,OPTIONStidak masuk akal ( SERVER_PORTakan menjadi nomor port nomor tempat permintaan diterima).
larsks
Terima kasih, larsks. Sepertinya saya menjalankan apache 2.0 yang tidak mendukung arahan <If>. Mungkin saya perlu melihat ke peningkatan ke 2.3. Setidaknya ini menjelaskan mengapa tidak ada contoh di mana saja (fitur ini sangat baru). Terima kasih atas sarannya.
cwd

Jawaban:

15

<If> hanya tersedia di Apache 2.4+, jadi pertama-tama pastikan bahwa Anda memiliki versi itu.

Contohnya

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Alternatif untuk <If>

Ada beberapa solusi lain untuk melakukan pernyataan bersyarat di Apache 2.2 jika Anda masih terjebak dengan itu.

  • Anda dapat mengatur variabel lingkungan melalui:

    • Konfigurasi Apache
    • SetEnvIf
    • mod_rewrite's RewriteMatch
  • Kemudian Anda dapat melakukan pernyataan kondisional menggunakan

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Contoh:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
Simon East
sumber
1
Tes tetapi tidak berhasil! dalam dokumen dari apache, <IfDefine>direktif hanya parse saat startup dan parameter-namehanya dapat lewat dengan prompt perintah menggunakanhttpd -Dx=y
William Leung
"Alternatif untuk Jika" Anda berfungsi dengan baik untuk saya, contoh yang bagus.
Kyborek