Variabel httpd.conf: Apa perbedaan antara $ {var} dan% {var}?

7

Apa perbedaan antara ${var}dan %{var}di httpd.conf?

Bagaimana dan kapan seseorang akan menggunakan ${}dan %{}?

http://httpd.apache.org/docs/2.4/configuring.html menyebutkan:

Nilai-nilai variabel yang didefinisikan dengan variabel Tentukan atau lingkungan shell dapat digunakan dalam baris file konfigurasi menggunakan sintaks $ {VAR}.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html menyebutkan:

Variabel-Server: Ini adalah variabel-variabel dalam bentuk% {NAME_OF_VARIABLE}

dan

Ekspansi RewriteMap: Ini adalah ekspansi dari bentuk $ {mapname: key | default}.

Akan ${VAR}digunakan di mana-mana di httpd.conf, kecuali di direktif mod_rewrite (seperti RewriteCond, RewriteRule tetapi kecuali untuk ekspansi RewriteMap yang digunakan ${}seperti dalam RewriteRule ^ / ex /(.*) $ {examplemap: $ 1} )

Apakah variabel diatur dalam httpd.conf menggunakan SetEnvIfDirective, untuk digunakan dalam httpd.conf yang sama, digunakan sebagai ${var}kecuali ketika variabel digunakan dengan direktif mod_rewrite, di mana variabel akan digunakan sebagai %{var}?

X10
sumber

Jawaban:

5

Apa perbedaan antara $ {var} dan% {var} di httpd.conf?

Semuanya cukup banyak. Tidak ada aturan keras dan cepat yang mengatakan " $tidak x, %ya", karena mereka melakukan hal-hal yang berbeda tergantung di mana dan bagaimana mereka digunakan.

Akankah $ {VAR} digunakan di mana saja di httpd.conf, kecuali dalam direktif mod_rewrite

Tidak - ${VAR}diterapkan sebagai pengganti di setiap lokasi di seluruh konfigurasi, bahkan di jalur terkait mod_rewrite. Ini hanya dapat didefinisikan saat startup menggunakan -Dopsi yang diteruskan ke biner httpd, atau Definearahan.

Ini bisa dilakukan karena variabel-variabel itu tidak boleh mengandung :karakter, sedangkan RewriteMappenggunaannya harus mengandung :karakter. Hal ini memungkinkan untuk $digunakan dengan cara yang sangat berbeda tanpa konflik - parser melihat :dan mengetahui bahwa itu tidak seharusnya menggantikan itu.

Apakah variabel diatur dalam httpd.conf menggunakan SetEnvIf Directive, untuk digunakan dalam httpd.conf yang sama, digunakan sebagai $ {var} kecuali ketika variabel tersebut digunakan dengan direktif mod_rewrite's, di mana variabel tersebut akan digunakan sebagai% {var}?

Tidak. Variabel lingkungan tidak sama dengan variabel yang ditetapkan melalui -Datau Define- mereka adalah konteks per permintaan yang sepenuhnya terpisah (yaitu yang sedang Anda atur SetEnvIf), yang hanya akan digunakan oleh arahan tertentu. Mereka secara khusus disebutkan di mana didukung - di mod_rewrite mereka %{ENV:variable}, di log mereka %{variable}e, dan banyak arahan memiliki pemeriksaan logika yang terlihat seperti env=variable.


Pada dasarnya; itu adalah kekacauan yang membingungkan - bukti sejarah server web selama beberapa dekade terakhir. Mungkin hal utama yang membingungkan Anda adalah bahwa sintaks mod_rewrite tidak meluas ke bagian lain dari konfigurasi dengan cara apa pun; itu semua berbeda. Poin utama untuk mengambil dari semua ini adalah bahwa tidak ada 'aturan' yang mengatur untuk membuat semua ini masuk akal - $di satu tempat berarti sesuatu yang sama sekali berbeda dari $di tempat lain.

Beberapa poin referensi yang berguna:

  1. Jika Anda ingin menetapkan variabel secara statis saat Apache dimulai, gunakan Definedan ${VAR}ganti satu kali, pada startup Apache. Ini sebagian besar berguna ketika Anda ingin melakukan sesuatu seperti berbagi file konfigurasi antara pengembangan dan lingkungan produksi - tetapi itu tidak menjadi bingung dengan penggunaan $dari RewriteMap, yang selalu berisi a :.
  2. Jika Anda ingin bekerja dengan variabel dalam permintaan tertentu, maka variabel lingkungan adalah yang Anda cari - tetapi Anda tidak dapat membuat asumsi tentang sintaksis yang akan Anda gunakan untuk mendapatkannya ketika digunakan dengan arahan tertentu. Anda harus memeriksa dokumentasi untuk arahan itu.
  3. Ketika mod_rewrite dipertanyakan, buang semua yang Anda tahu tentang variabel dan sintaksisnya. Ini memiliki set variabel sendiri %{VAR}, Anda bisa mendapatkan variabel lingkungan 'normal' dengan %{ENV:VAR}, dan Anda dapat mengatur variabel lingkungan [E=VAR].
Shane Madden
sumber
Wow! terima kasih untuk penulisan yang begitu panjang! Saya perlu waktu untuk mencerna ini. Cukup aneh bahwa dokumentasi Apache tidak mendokumentasikan ini di satu tempat, ini pasti cukup membingungkan bagi banyak pemula.
X10
Ya - dokumen mereka tidak buruk untuk konsep tertentu, tetapi hal-hal 'gambaran besar' seperti ini jauh lebih tidak jelas.
Shane Madden
1

Saya telah melihat kode sumber mod_rewrite, dan menemukan bahwa catatan dalam komentar (fungsi do_expand):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

jadi kelihatannya, seperti% untuk variabel yang tepat, sedangkan $ untuk pencarian di tabel hash ("maps"). juga, semua ekspansi mod_rewrite sepenuhnya bebas dari inti - seluruh ekspansi dilakukan dalam modul dengan sendirinya.

Saya berpikir sebelumnya, tetapi itu salah:

$ {} vars menggunakan lingkungan proyek, dan dievaluasi pada saat konfigurasi parse.

% {} vars menggunakan lingkungan permintaan, dan dievaluasi pada saat permintaan diuraikan. mod_rewrite menggunakan% {} symantic untuk mencegah interpolasi konfigurasi-waktu yang dibuat oleh httpd core.

datacompboy
sumber
Terima kasih, bisakah Anda menyertakan tautan ke dokumentasi asli untuk ini dan jika memungkinkan, tautkan ke tutorial?
X10
Saya belum pernah melihatnya dalam teks yang jelas dalam dokumentasi. Begitulah cara saya memahami mengapa itu dilakukan. Dan itu salah :)
datacompboy