pesanan sintaks mod_rewrite
mod_rewrite memiliki beberapa aturan pemesanan khusus yang memengaruhi pemrosesan. Sebelum apa pun dilakukan, RewriteEngine On
arahan perlu diberikan karena ini mengaktifkan pemrosesan mod_rewrite. Ini harus ada sebelum arahan penulisan ulang lainnya.
RewriteCond
sebelumnya RewriteRule
membuat bahwa SATU aturan tunduk pada persyaratan. Setiap RewriteRules berikut akan diproses seolah-olah mereka tidak tunduk pada persyaratan.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
Dalam kasus sederhana ini, jika pengarah HTTP berasal dari serverfault.com, arahkan kembali permintaan blog ke halaman khusus serverfault (kami hanya istimewa itu). Namun, jika blok di atas memiliki garis RewriteRule tambahan:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Semua file .jpg akan menuju ke halaman kesalahan server khusus, bukan hanya yang dengan perujuk yang menunjukkannya berasal dari sini. Ini jelas bukan maksud dari bagaimana aturan ini ditulis. Ini bisa dilakukan dengan beberapa aturan RewriteCond:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Tetapi mungkin harus dilakukan dengan beberapa sintaks pengganti yang lebih rumit.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteRule yang lebih kompleks berisi persyaratan untuk diproses. Tanda kurung terakhir, (html|jpg)
memberi tahu RewriteRule untuk mencocokkan salah satu html
atau jpg
, dan untuk mewakili string yang cocok sebagai $ 2 dalam string yang ditulis ulang. Ini secara logis identik dengan blok sebelumnya, dengan dua pasangan RewriteCond / RewriteRule, itu hanya dilakukan pada dua baris, bukan empat.
Beberapa baris RewriteCond secara implisit ANDed, dan dapat secara eksplisit ORed. Untuk menangani referer dari ServerFault dan Pengguna Super (eksplisit ATAU):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Untuk melayani halaman yang dirujuk oleh ServerFault dengan browser Chrome (DAN implisit):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
juga dipesan khusus karena menentukan cara RewriteRule
arahan berikut menangani pemrosesan mereka. Ini sangat berguna dalam file .htaccess. Jika digunakan, itu harus menjadi arahan pertama di bawah "RewriteEngine on" dalam file .htaccess. Ambil contoh ini:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Ini memberi tahu mod_rewrite bahwa URL khusus yang sedang ditangani tiba dengan cara http://example.com/blog/ alih-alih jalur direktori fisik (/ home / $ Username / public_html / blog) dan untuk memperlakukannya sesuai. Karena itu, RewriteRule
anggap itu string-mulai setelah "/ blog" di URL. Berikut adalah hal yang sama ditulis dua cara berbeda. Satu dengan RewriteBase, yang lain tanpa:
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Seperti yang Anda lihat, RewriteBase
memungkinkan penulisan ulang aturan untuk meningkatkan jalur situs web ke konten daripada server web , yang dapat membuatnya lebih mudah dipahami oleh mereka yang mengedit file tersebut. Juga, mereka dapat membuat arahan lebih pendek, yang memiliki daya tarik estetika.
Sintaks yang cocok dengan RewriteRule
RewriteRule sendiri memiliki sintaks yang kompleks untuk string yang cocok. Saya akan menutupi bendera (hal-hal seperti [PT]) di bagian lain. Karena Sysadmin belajar dengan contoh lebih sering daripada dengan membaca halaman manual, saya akan memberikan contoh dan menjelaskan apa yang mereka lakukan.
RewriteRule ^/blog/(.*)$ /newblog/$1
The .*
konstruk cocok dengan karakter tunggal ( .
) nol atau lebih kali ( *
). Melampirkannya di dalam tanda kurung menyuruhnya memberikan string yang cocok dengan variabel $ 1.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
Dalam hal ini, yang pertama. * TIDAK disertakan dalam parens sehingga tidak disediakan untuk string yang ditulis ulang. Aturan ini menghapus level direktori pada situs blog baru. (/blog/2009/sample.html menjadi /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
Dalam kasus ini, ekspresi kurung pertama mengatur grup yang cocok. Ini menjadi $ 1, yang tidak diperlukan dan karenanya tidak digunakan dalam string yang ditulis ulang.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
Dalam hal ini, kami menggunakan $ 1 dalam string yang ditulis ulang.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Aturan ini menggunakan sintaks braket khusus yang menentukan rentang karakter . [0-9] cocok dengan angka 0 hingga 9. Aturan khusus ini akan menangani tahun dari 2000 hingga 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Ini melakukan hal yang sama dengan aturan sebelumnya, tetapi bagian {2} mengatakannya untuk mencocokkan karakter sebelumnya (ekspresi kurung dalam kasus ini) dua kali.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Kasing ini akan cocok dengan huruf kecil apa pun dalam ekspresi pencocokan kedua, dan melakukannya untuk karakter sebanyak mungkin. The \.
membangun mengatakan itu untuk mengobati periode sebagai periode yang sebenarnya, bukan karakter khusus itu di contoh sebelumnya. Akan rusak jika nama file memiliki tanda hubung di dalamnya.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Ini menjebak nama file dengan tanda hubung di dalamnya. Namun, seperti -
karakter khusus dalam ekspresi braket, itu harus menjadi karakter pertama dalam ekspresi.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Versi ini menjebak nama file apa pun dengan huruf, angka atau -
karakter dalam nama file. Ini adalah bagaimana Anda menentukan beberapa set karakter dalam ekspresi braket.
Bendera RewriteRule
Bendera pada aturan penulisan ulang memiliki sejumlah makna dan penggunaan khusus .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
Bendera adalah [L]
di akhir ungkapan di atas. Beberapa bendera dapat digunakan, dipisahkan oleh koma. Dokumentasi tertaut menjelaskan masing-masing, tetapi di sini mereka tetap:
L = Terakhir. Hentikan pemrosesan RewriteRules setelah ini cocok. Jumlah pesanan!
C = Rantai. Lanjutkan memproses RewriteRule berikutnya. Jika aturan ini tidak cocok, maka aturan selanjutnya tidak akan dieksekusi. Lebih lanjut tentang ini nanti.
E = Setel variabel lingkungan. Apache memiliki berbagai variabel lingkungan yang dapat memengaruhi perilaku server-web.
F = Dilarang. Mengembalikan kesalahan 403-Terlarang jika aturan ini cocok.
G = Pergi. Mengembalikan kesalahan 410-Gone jika aturan ini cocok.
H = Handler. Memaksa permintaan untuk ditangani seolah-olah itu adalah tipe MIME yang ditentukan.
N = Selanjutnya. Memaksa aturan untuk memulai kembali dan mencocokkan kembali. HATI-HATI! Pengulangan bisa terjadi.
NC = Tidak ada kasing. Memungkinkanjpg
untuk mencocokkan jpg dan JPG.
NE = Tidak ada jalan keluar. Mencegah penulisan ulang karakter khusus (.? # & Dll) ke dalam persamaan kode-heksnya.
NS = Tidak ada subrequest. Jika Anda menggunakan sisi-sisi-server, ini akan mencegah kecocokan dengan file yang disertakan.
P = Proxy. Memaksa aturan ditangani oleh mod_proxy. Secara transparan menyediakan konten dari server lain, karena server web Anda mengambilnya dan menyajikannya kembali. Ini adalah bendera yang berbahaya, karena yang ditulis dengan buruk akan mengubah server web Anda menjadi proxy-terbuka dan Itu Buruk.
PT = Lewati. Mempertimbangkan pernyataan Alias akun dalam pencocokan RewriteRule.
QSA = QSAppend. Saat string asli berisi kueri ( http://example.com/thing?asp=foo) menambahkan string kueri asli ke string yang ditulis ulang. Biasanya itu akan dibuang. Penting untuk konten dinamis.
R = Redirect. Berikan pengalihan HTTP ke URL yang ditentukan. Dapat juga memberikan kode redirect yang tepat [R = 303]. Sangat mirip RedirectMatch
, yang lebih cepat dan harus digunakan jika memungkinkan.
S = Lewati. Lewati aturan ini.
T = Jenis. Tentukan tipe pantomim dari konten yang dikembalikan. Sangat mirip dengan AddType
arahan.
Anda tahu bagaimana saya mengatakan itu RewriteCond
berlaku untuk satu dan hanya satu aturan? Nah, Anda bisa menyiasatinya dengan merantai.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Karena RewriteRule pertama memiliki flag Chain, aturan penulisan ulang kedua akan dieksekusi ketika yang pertama melakukannya, yaitu ketika aturan RewriteCond sebelumnya dicocokkan. Berguna jika ekspresi reguler Apache membuat otak Anda sakit. Namun, metode all-in-one-line yang saya tunjukkan di bagian pertama lebih cepat dari sudut pandang optimasi.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Ini dapat dibuat lebih sederhana melalui flag:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Juga, beberapa flag juga berlaku untuk RewriteCond. Khususnya, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Akan cocok dengan "ServerFault.com"