Bagaimana saya bisa menggunakan SetEnvIf untuk mengatur variabel berdasarkan Host Http?


11

Saya mencoba mengatur variabel di Apache

ENV = DEV jika host http adalah URL dev

atau

ENV = PRD jika host http adalah URL prd

dan kemudian gunakan $ _SERVER ['ENV'] untuk membuat beberapa cabang logika

Sejauh ini tidak ada yang berfungsi untuk saya dan kami memiliki modul setenvif yang diinstal

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Apa cara yang benar untuk melakukan ini?

Jawaban:


15

Melihat sekilas pada dokumentasi :

Arahan SetEnvIf mendefinisikan variabel lingkungan berdasarkan atribut permintaan. Atribut yang ditentukan dalam argumen pertama dapat menjadi salah satu dari tiga hal:

Bidang tajuk permintaan HTTP (lihat RFC2616 untuk informasi lebih lanjut tentang ini); misalnya: Host, User-Agent, Referer, dan Bahasa Terima. Ekspresi reguler dapat digunakan untuk menentukan sekumpulan header permintaan.

Jadi, tentu saja memungkinkan untuk membuat variabel lingkungan bersyarat pada Hostheader. Sepertinya Anda mencoba menggunakan salah satu Refereratau Remote_Hosttajuk, yang keduanya tidak persis seperti yang Anda inginkan (walaupun secara teori Refererharus berisi nilai Hosttajuk dalam kebanyakan kasus). Remote_Hostakan menjadi nama host dari klien yang membuat permintaan, yang sama sekali tidak seperti yang Anda inginkan (dan dalam sebagian besar konfigurasi tidak akan tersedia, karena biasanya pencarian DNS dimatikan karena alasan kinerja).

Coba sesuatu seperti ini:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... dan kemudian gunakan $ _SERVER ['ENV'] untuk membuat beberapa cabang logika

Tetapi perhatikan juga bahwa Anda dapat dengan mudah mereferensikan nilai Hostheader secara langsung di PHP tanpa melalui ketidakjujuran ini; $_SERVER['HTTP_HOST']akan memiliki apa yang Anda inginkan.


Cantik. Ini izinkan saya menulis aturan khusus untuk meminta kata sandi saat menghubungkan ke Host tertentu, tetapi tidak yang lain (yaitu, melindungi kotak pementasan ketika satu VM dikloning ke beberapa instance Amazon EC2, tetapi jangan menulis resep Chef khusus). Sangat berguna, jika sulit dicari, fungsionalitasnya.
Eric L.

1
The SetEnvIfdocs mengatakan bahwa param 3 adalah regex, seharusnya tidak titik-titik dalam nama domain akan lolos dengan garis miring terbalik? Atau apakah mengutip nilai dalam tanda kutip ganda membuat Apache memperlakukannya sebagai string literal?
jakub.g

@ jakub.g Ya, mereka adalah regex dan harus melarikan diri. Dalam hal ini, karena titik cocok dengan karakter tunggal mana pun, sebuah "www-dev.example.com"regex juga akan cocok dengan Nama Inang yang tidak terduga, seperti www-dev-example.com. Anda akan mendapatkan pertandingan yang diharapkan dan banyak lagi. Saya telah memperbarui contohnya sekarang.
Martijn Heemels
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.