Kata pengantar
Saya sangat baru tentang webservers. Saya sedang menyiapkan server Apache2 dan saat ini sedang meneliti dokumentasi.
Saya melihat bahwa <Directory>
, <Location>
, dan <Files>
arahan masing-masing memiliki sesuai <*Match>
direktif: <DirectoryMatch>
, <LocationMatch>
dan <FilesMatch>
masing-masing. Perbedaan pada permukaan cukup jelas:
<*Match>
arahan mengambil ekspresi reguler sebagai argumen- Arahan Non-Match mengambil argumen string atau globe-style-shell sebagai argumen mereka.
Anehnya, arahan non-Match juga dapat diberikan ekspresi reguler sebagai argumen mereka jika didahului oleh '~'. Dengan demikian, dua baris berikut harus identik:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Pertanyaan
Yang ingin saya ketahui adalah apakah ada perbedaan halus atau penting yang perlu diperhatikan bahwa dokumen Apachecore
tidak disebutkan. The <DirectoryMatch>
bagian tidak menyebutkan satu perbedaan halus:
Kesesuaian
Sebelum 2.3.9 , arahan ini secara implisit diterapkan pada sub-direktori (seperti
<Directory>
) dan tidak dapat cocok dengan simbol garis akhir ($). Pada 2.3.9 dan yang lebih baru , hanya direktori yang cocok dengan ekspresi yang dipengaruhi oleh arahan terlampir.
Selain itu, saya ingin tahu:
- Apakah ada perbedaan lain antara arahan Match dan non-Match?
- Arahan mana yang lebih disukai ketika ekspresi reguler diperlukan?
- Adakah informasi lain yang Anda rasa relevan?
Catatan
<DirectoryMatch>
dan<Directory "~">
berada pada level gabungan yang sama- Meskipun tidak disebutkan secara eksplisit,
<Directory "~">
dapat menggunakan grup dan referensi yang bernama, seperti<DirectoryMatch>
.
sumber
<Directory ~
dan<DirectoryMatch
, tidak<Directory
. Sampai Apache 2.3.9,<Directory ~
bisa dibilang superset karena mendukung$
jangkar regex, sedangkan<DirectoryMatch
tidak. (Ini mungkin juga mengapa rekomendasi untuk menggunakanDirectoryMatch
dihapus dalam dokumen sebelumnya?)DirectoryMatch
Masih unggul karenaDirectory ~
ditangani hanya setelahDirectory
pernyataan " normal " , danDirectoryMatch
memungkinkan Anda untuk mengambil data yang selanjutnya dapat Anda gunakan." - tetapi sebagaimana dicatat oleh OP, arahan ini sama dalam kedua hal ini.DirectoryMatch
lebih mudah dibaca dan oleh karena itu lebih disukai (lebihDirectory ~
). Meskipun dokumen tidak secara eksplisit menyatakan hal ini,DirectoryMatch
digunakan dalam semua contoh terbaru (mis. Pada halaman Bagian Konfig ) danDirectory ~
tidak pernah mendapat penyebutan. Namun, dokumen secara eksplisit menyatakan bahwa nama yang samaLocationMatch
danFilesMatch
lebih disukai daripada~
versi yang sesuai dari arahan ini.DirectoryMatch
tidak mendukung$
jangkar sebelum Apache 2.3.9? Komit yang saya temukan terkait dengan Apache 1.2 / 1.3, sejauh ini sebelumnya.<Directory ~
bahkan termasuk jangkar end-of-string. Ya, saya melihat komitmen tersebut berasal dari 1.2 / 1.3 - penggalian yang bagus! :) Ini juga dinyatakan dalam dokumentasi Apache 1.3 saatDirectoryMatch
diperkenalkan. Ada juga perubahan di Apache 1.3 (dari 1.2) sehubungan dengan bagaimana wadah regex (mis.<Directory ~
Dan yang baru saja diperkenalkan<DirectoryMatch
) digabung.Tidak sepenuhnya perbedaan antara dua versi regex (
<Directory ~
dan<DirectoryMatch
), tetapi beberapa arahan, sepertiAllowOverride
danAllowOverrideList
, hanya diizinkan dalam wadah polos (non-regex)<Directory>
. Jadi, itu tidak termasuk keduanya<Directory ~
dan<DirectoryMatch
.Referensi:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
sumber