Memasang mod tulis semula. Dayakan modul tulis semula Mod dalam Apache

Modul pelayan web Apache ini direka untuk menukar URL sumber. Keupayaannya sangat besar, tetapi ia sering digunakan untuk mencipta CNC (URL Boleh Dibaca Manusia). Apakah maksudnya. Daripada menggunakan http://example.com/2005/12 / 31/theme.html Mekanisme ini sangat kerap digunakan di laman berita. Pada masa yang sama, ini adalah satu kelebihan untuk keselamatan. Pengguna tidak melihat fail (skrip) yang sebenarnya sedang diakses.

Mari lihat beberapa soalan di bawah:
1. Bagaimana untuk mendayakan mod_rewrite pada Apache?
2. Sedikit teori. Cara mod_rewrite berfungsi.
3. Contoh mudah.
4. Apakah yang perlu dilakukan dalam skrip?
5. Apakah yang memberikan pendekatan ini dan mod_rewrite secara umum?
6. Kemungkinan ralat.
7. Alma Mater untuk belajar mod_rewrite

1. Bagaimana untuk mendayakan mod_rewrite pada Apache?

Untuk mendayakan mod_rewrite pada pelayan web Apache, anda perlu mengedit fail httpd.conf.
Untuk melakukan ini, buka fail httpd.conf, cari baris:

Kod itu
#LoadModule rewrite_module modules/mod_rewrite.so

Dan keluarkan komen

Kod itu
LoadModule rewrite_module modules/mod_rewrite.so

Kemudian kita mulakan semula pelayan web.

2. Sedikit teori. Cara mod_rewrite berfungsi.

Sebagai peraturan, pengaturcara yang baru sahaja menemui mod_rewrite tidak memahami sepenuhnya cara mekanisme ini berfungsi. Kerana ini, untuk masa yang lama mereka berteka-teki tentang "kesilapan kebudak-budakan.

Jadi. Seperti yang kita tahu, terdapat permintaan GET yang dipanggil, i.e. http://example.com/2005/12/31/theme.html , yang "datang" ke pelayan web (dalam contoh kami, Apache). Apa yang pelayan lakukan. Pertama sekali, dia melihat tetapan hos ini. Kemudian dia memutuskan apa yang perlu dilakukan seterusnya. Sama ada hantar semula kandungan halaman utama (index.html, contohnya) kepada pengguna, atau hantar kod skrip pengepala index.php untuk tafsiran, atau kembalikan ralat 404, dsb. dll. Mari kita anggap bahawa kita akan terus bekerja dengan index.phtml. Apa yang akan berlaku seterusnya, anda mungkin sudah tahu. Kami akan memberi tumpuan pada saat pelayan melihat tetapan hos. Mungkin terdapat sejumlah besar daripada mereka. Tetapi tanpa gagal, pelayan cuba mencari fail .htaccess dalam akar. (Fail konfigurasi Apache dengan cepat). Dalam fail ini terdapat peraturan transformasi mod_rewrite (ia juga boleh didapati dalam httpd.conf). Itu. Saya terus mengatakan bahawa penukaran URL dilakukan SEBELUM skrip berfungsi.

Algoritmanya adalah seperti berikut:
1. Pelayan menerima permintaan GET: http://example.com/2005/12/31/theme.html
2. Cari peraturan transformasi mod_rewrite dalam .htaccess.
3. Berubah.
4. Ubah hala ke index.phtml mengikut peraturan penukaran.
5. Skrip mula berfungsi.

3. Contoh mudah.

Ramai daripada anda telah melihat perkara ini: http://example.com/2005/12/31/theme.html . Alamat sedemikian sering digunakan oleh laman berita. Sememangnya, mereka tidak mempunyai semua folder dan fail html ini. Semua data diproses oleh skrip. Di bawah ini kami mempertimbangkan salah satu pilihan untuk transformasi sedemikian. Saya akan memberitahu anda segera. Terdapat banyak pilihan, saya hanya mengambil satu kes tertentu, yang saya sendiri gunakan dan menganggapnya paling universal.

Kod itu
Tulis semula Enjin hidup
Pilihan +FollowSymlinks
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^(.*)$ index.phtml

Mari kita pertimbangkan semuanya mengikut urutan.
Dua RewriteCond berturut-turut ialah syarat di antaranya terdapat DAN.
Itu. Jika alamat yang diminta bukan fail atau direktori sebenar, ubah hala ke index.phtml. Itu. oleh itu, kami menyedari bahawa permintaan kami untuk http://example.com/2005/12/31/theme.html akan diproses oleh skrip index.phtml. Kini keseluruhan persoalannya ialah bagaimana kita mengetahui dalam skrip yang diminta pengguna /2005/12/31/theme.html.

Terdapat kelainan lirik di sini. Beberapa perkataan tentang RewrtiterRule. Arahan mempertimbangkan parameter. Yang pertama (dalam kes kami: ^(.*)$) ialah rentetan ungkapan biasa yang menyemak sama ada alamat yang diminta (dalam kes kami: /2005/12/31/theme.html) sepadan dengan corak (dalam kes kami, ya, iaitu j. corak berkata: "sebarang aksara 0 atau lebih kali" dari awal hingga akhir rentetan - ^(.*)$). Jika corak berpuas hati, mod_rewrite mengubah hala permintaan ke fail yang dinyatakan dalam parameter kedua (dalam kes kami: index.phtml).

Kini keseluruhan persoalannya ialah bagaimana skrip mengetahui tentang "/2005/12/31/theme.html". Terdapat dua pilihan.
pertama:

Kod itu
RewriteRule ^(.*)$ index.phtml?$1 [L]

Di mana "/2005/12/31/theme.html" akan dihantar ke skrip index.phtml dalam pembolehubah QUERY_STRING, kerana $1 ialah kurungan pertama dalam corak, yang bersamaan dengan: http://example.com/?/2005/12/31/theme.html . Tetapi, adakah anda pernah melihat ini di mana-mana? Tidak. Oleh itu, kami menggunakan QSA sebagai kunci.

Terdapat pembolehubah pelayan (yang mana skrip mempunyai akses) REQUEST_URI yang sentiasa mengandungi permintaan GET ("/2005/12/31/theme.html"). Jadi, jika kita mengubah hala ke index.phtml, maka REQUEST_URI sepatutnya mendapat nilai index.phtml, TETAPI kunci QSA menggantikannya dengan "/2005/12/31/theme.html". Itu. kami mengubah hala secara fizikal ke index.phtml dan secara logik menunjukkan skrip yang diakses oleh pengguna "/2005/12/31/theme.html".

4. Membuat skrip

Kami kini bekerja dengan index.phtml, skrip yang kami ubah hala. Saya katakan dengan segera, kod itu dalam PHP, kerana Saya tidak mahir dalam bahasa lain untuk web.

Semudah itu. Kini anda boleh beroperasi pada tatasusunan ini. Untuk menjadikannya lebih jelas. Saya akan berikan anda satu analogi. Katakan URLnya ialah: http://example.com/index.phtml?year=2005&m...y=31&news=theme . Seperti yang kita ketahui, dalam skrip, parameter ini akan tersedia melalui tatasusunan $_GET.
jadi, $_GET['tahun'] sama dengan $arr, $_GET['bulan'] sama dengan $arr, $_GET['hari'] sama dengan $arr, $_GET ['tema' ] adalah sama dengan $arr (hanya perlu memotong ".html" juga).

5. Apakah yang memberikan pendekatan ini dan mod_rewrite secara umum?

Pertama, untuk enjin carian, URL seperti: http://example.com/?/2005/12/31/theme.html adalah lebih menyenangkan daripada http://example.com/index.phtml?year=2005&m. .. y=31&news=theme , dan untuk pengguna, anda juga akan bersetuju.

Detik kedua. Dengan mod_rewrite, kemungkinan serangan XSS secara praktikal dihapuskan, kerana include bug boleh dikatakan bertindih. Dalam contoh ini, ini tidak begitu kelihatan, tetapi ambil kata saya untuk itu, ia adalah. Tetapi dalam apa jua keadaan, semuanya bergantung pada kepala anda!!!

Perkara ketiga ialah menyembunyikan teknologi yang sebenarnya digunakan. ini sebahagiannya merumitkan penggodaman tapak, tetapi ini hanya had atas, seperti lumpur di kolam bertakung.

6. Kemungkinan ralat

Biasanya, ralat berikut mungkin berlaku:

404 - Dokumen tidak ditemui. Punca: Peraturan RewriteRule tidak menyala.
403 - Dilarang - akses ditolak. Peraturan penulisan semula mengandungi ralat logik yang berlaku kerana percubaan untuk mengubah hala ke fail yang tiada akses (/index.php - ia akan memberikan ini dengan tepat, kerana / dalam sistem UNIX bermaksud laluan dari direktori akar SERVER, di mana anda secara semula jadi tidak mempunyai akses).
500 – Ralat Pelayan Dalaman. Sebabnya ialah ralat sintaks dalam fail .htaccess.

7. Alma Mater untuk belajar mod_rewrite

Secara peribadi, artikel ini banyak membantu saya. Berikut adalah abstraknya, dan di bawah saya melampirkan fail ZIP. Ia mengandungi artikel ini dalam format RTF,

petikan
"Kelebihan utama yang diberikan oleh mod_rewrite kepada anda ialah kebolehkonfigurasian dan fleksibiliti yang wujud dalam Sendmail. Kelemahan mod_rewrite ialah kebolehkonfigurasian dan fleksibiliti yang wujud dalam Sendmail."

Brian Behlendorf

Kumpulan Apache
"Walaupun banyak contoh dan dokumentasi, mod_rewrite adalah Voodoo. Voodoo yang keren, tetapi masih voodoo."

Brian Moore
[e-mel dilindungi]

Selamat datang ke dunia mod_rewrite, pisau swiss penulisan semula URL!
Modul ini menggunakan enjin berasaskan peraturan (penghurai berdasarkan ungkapan biasa) untuk transformasi URL dengan segera. Ia menyokong bilangan peraturan yang tidak terhad dan bilangan syarat yang tidak terhad yang dikaitkan dengan peraturan untuk melaksanakan mekanisme yang benar-benar fleksibel dan berkuasa untuk transformasi URL. URL Transform boleh bergantung pada pelbagai kriteria, seperti pembolehubah pelayan, pembolehubah persekitaran, pengepala HTTP, cap masa dan juga permintaan pangkalan data luaran dalam format yang berbeza boleh digunakan untuk benar-benar sepadan dengan jangkaan anda terhadap URL yang ditukar.

Modul ini beroperasi pada URL penuh (termasuk maklumat laluan) dalam konteks pelayan (httpd.conf) dan konteks direktori (.htaccess) malah boleh menjana bahagian rentetan pertanyaan sebagai hasilnya. Hasil yang ditukar mungkin menyebabkan permintaan diproses secara dalaman, diubah hala secara luaran, atau malah melalui modul proksi dalaman.

Walau bagaimanapun, semua fungsi dan fleksibiliti ini datang dengan kelemahan: kerumitan. Jadi jangan harap untuk memahami keseluruhan modul ini dalam satu hari.
Modul ini direka bentuk dan ditulis pada April 1996 dan disumbangkan secara eksklusif oleh The Apache Group pada Julai 1997

Ralf S. Engelchall
[e-mel dilindungi]
www.engelschall.com

penting:

    Sokongan fail ".htaccess" hanya tersedia pada pengehosan Linux. Pada fungsi pengehosan Windows ".htaccess" melaksanakan fail web.config.

    Modul sokongan ".htaccess" tersedia pada semua rancangan pengehosan bersama berdasarkan OS Linux. Jika anda menerima mesej yang mengatakan bahawa tiada sokongan semasa memasang CMS ".htaccess" abaikan sahaja.

Saya tidak mempunyai fail .htaccess, apakah yang perlu saya lakukan?

Jika anda menyediakan pelayan web Apache tetapi tidak mempunyai .htaccess, cipta dan tulis arahan yang diperlukan.

Untuk mencipta .htaccess, masukkan panel kawalan pengehosan mengikut arahan: Letakkan fail .htaccess dalam direktori tapak menggunakan artikel: .

Jika anda secara tidak sengaja memadam fail .htaccess, pulihkan ia. Atau tambahkan fail standard .htaccess untuk CMS anda:

Fail .htaccess tidak kelihatan dalam cPanel

Untuk melihat fail tersembunyi (bermula dengan titik) dalam cPanel, ikut langkah berikut:

Bagaimana untuk membolehkan penulisan semula mod?

Modul "mod_rewrite" hadir pada semua pelan pengehosan Linux. Untuk mengaktifkan "mod_rewrite" tambah pada fail .htaccess garis pandangan.

Dalam tutorial ini, kita akan belajar cara mengurus penulisan semula URL menggunakan Apache 2 dan modul mod_rewrite. Modul ini membolehkan anda menulis semula URL dengan cara yang lebih bersih, menterjemah laluan yang boleh dibaca manusia ke dalam rentetan pertanyaan mesra kod atau mengubah hala URL berdasarkan syarat tambahan.

Panduan ini terbahagi kepada dua bahagian. Yang pertama memasang tapak web sampel dan menunjukkan contoh penulisan semula yang mudah. Bahagian kedua mengandungi dua lagi contoh yang lebih mendalam tentang peraturan penulisan semula yang biasa digunakan.

Prasyarat

Mengikuti panduan ini, anda perlu:

  • Satu pelayan Debian 8 dipasang dengan persediaan pelayan awal.
  • Apache 2 dipasang pada pelayan selepas artikel itu.

Langkah 1 - Dayakan mod_rewrite

Pertama, kita perlu mendayakan mod_rewrite . Ia tersedia tetapi tidak disertakan dengan pemasangan bersih Apache 2.

Sudo a2enmod tulis semula

Ia mengaktifkan modul atau memberi amaran kepada anda bahawa modul sudah didayakan. Mulakan semula Apache untuk perubahan berkuat kuasa.

mod_rewrite kini didayakan sepenuhnya. Dalam langkah seterusnya, kami akan mencipta fail .htaccess yang akan kami gunakan untuk menentukan peraturan penulisan semula untuk ubah hala.

Langkah 2 - Menyediakan .htaccess

Fail .htaccess membolehkan kami mengubah suai peraturan penulisan semula kami tanpa mengakses fail konfigurasi pelayan. Atas sebab ini, .htaccess adalah penting untuk keselamatan aplikasi web anda. Tempoh yang mendahului nama fail memastikan fail itu tersembunyi.

Catatan

Sebarang peraturan yang anda letakkan dalam fail .htaccess juga boleh diletakkan terus dalam fail konfigurasi pelayan. Malah, dokumentasi Apache rasmi mengesyorkan menggunakan fail konfigurasi pelayan dan bukannya .htaccess kerana Apache memprosesnya dengan lebih pantas.

Walau bagaimanapun, dalam contoh mudah ini, keuntungan prestasi akan diabaikan. Selain itu, menetapkan peraturan .htaccess adalah berguna, terutamanya dengan berbilang tapak web pada pelayan yang sama. Ia tidak memerlukan permulaan semula pelayan untuk perubahan berkuat kuasa, dan ia tidak memerlukan keistimewaan superuser untuk mengedit peraturan ini, menjadikan penyelenggaraan dan perubahan mungkin daripada akaun bukan istimewa lebih mudah. Beberapa program sumber terbuka yang popular, seperti Joomla, sering bergantung pada fail .htaccess dalam perisian untuk mengubah suai dan mencipta peraturan tambahan atas permintaan.

Kami perlu memasang dan menjamin beberapa lagi tetapan sebelum kami boleh bermula.

Secara lalai, Apache tidak membenarkan penggunaan fail .htaccess untuk menguatkuasakan peraturan penulisan semula, jadi anda perlu membenarkan perubahan pada fail itu terlebih dahulu. Buka fail konfigurasi lalai Apache menggunakan nano atau editor teks kegemaran anda.

sudo nano /etc/apache2/sites-available/000-default.conf

Di dalam fail ini anda akan menemui blok , bermula dari baris pertama. Di dalam blok ini, tambahkan blok baharu berikut supaya fail konfigurasi anda kelihatan seperti ini. Pastikan semua blok diinden dengan betul.

/etc/apache2/sites-available/000-default.conf

Indeks Pilihan FollowSymLinks MultiViews AllowOverride All Memerlukan semua diberikan . . .

Simpan dan tutup fail. Mulakan semula Apache untuk perubahan berkuat kuasa.

sudo systemctl mulakan semula apache2

Sekarang buat fail .htaccess dalam direktori akar web anda.

Tambahkan baris ini di bahagian atas fail baharu untuk mendayakan penulisan ganti.

/var/www/html/.htaccess

Tulis semula Enjin hidup

Simpan fail dan keluar.

Anda kini mempunyai fail .htaccess langsung yang boleh anda gunakan untuk mengurus peraturan penghalaan aplikasi web anda. Dalam langkah seterusnya, kami akan mencipta fail tapak sampel yang akan kami gunakan untuk menunjukkan peraturan penulisan semula.

Langkah 3 - Menyediakan Penulisan Semula URL

Di sini kami akan menyediakan penulisan semula URL asas yang menukar URL kepada laluan kod sebenar. Khususnya, kami akan membenarkan pengguna mengakses. http://your_server_ip /about

Mari mulakan dengan mencipta fail bernama about.html dalam direktori akar web.

Sudo nano /var/www/html/about.html

Salin kod HTML berikut ke dalam fail, kemudian simpan dan tutupnya.

/var/www/html/about.html

Tentang kita

Tentang kita

Anda boleh mengakses http://your_server_ip/about.html tetapi ambil perhatian bahawa jika anda cuba mengakses http://your_server_ip/about anda akan melihat ralat 404 Tidak Ditemui. Tetapi untuk membolehkan pengguna mengakses halaman menggunakan kira-kira dan bukannya menulis semula peraturan, fungsi ini akan membenarkannya.

RewriteRules mengikut format berikut:

Struktur umum RewriteRule

Penggantian corak RewriteRule

  • RewriteRule mentakrifkan arahan.
  • corak ialah ungkapan biasa yang sepadan dengan rentetan yang dikehendaki daripada URL, jenis paparan pelayar.
  • penggantian ialah laluan ke URL sebenar, iaitu laluan pelayan fail Apache.
  • flags ialah parameter pilihan yang boleh anda ubah cara peraturan berfungsi.

Buka fail .htaccess.

sudo nano /var/www/html/.htaccess

Selepas baris pertama, tambahkan RewriteRule yang ditandakan dengan warna merah dan simpan fail tersebut.

/var/www/html/.htaccess

RewriteEngine pada RewriteRule ^about$ about.html

Dalam kes ini, ^about$ ialah templat, about.html ialah pengganti dan ialah bendera. Contoh kami menggunakan beberapa aksara dengan makna istimewa:

  • ^ menunjuk ke permulaan URL, selepas your_server_ip / .
  • $ menunjukkan penghujung URL.
  • about sepadan dengan rentetan "about".
  • about.html ialah fail sebenar yang diakses oleh pengguna.
  • ialah bendera yang menjadikan peraturan tidak sensitif huruf besar.

Sekarang, anda sepatutnya boleh mengakses http://your_server_ip/about dalam penyemak imbas anda. Malah, dengan peraturan yang ditunjukkan di atas, URL berikut akan menunjuk ke about.html:

  • http://your_server_ip /about , kerana definisi peraturan.
  • http://your_server_ip /About , memandangkan peraturan ini tidak sensitif huruf besar-besaran.
  • http://your_server_ip /about.html , kerana nama fail tersuai asal akan sentiasa berfungsi.

Di bawah tidak akan menjadi:

  • http://your_server_ip /about/ kerana peraturan menyatakan dengan jelas bahawa tidak boleh ada apa-apa selepas menggunakan aksara $.
  • http://your_server_ip /contact kerana ia tidak sepadan dengan baris perihal dalam peraturan.

Anda kini mempunyai fail .htaccess langsung dengan peraturan mudah yang anda boleh ubah suai dan lanjutkan untuk memenuhi keperluan anda. Dalam bahagian berikut, kami akan menunjukkan dua contoh tambahan arahan yang paling biasa digunakan.

Contoh 1 - Memudahkan Rentetan Pertanyaan dengan RewriteRule

Aplikasi web sering digunakan rentetan pertanyaan, yang ditambahkan pada URL menggunakan tanda soal (?) selepas alamat. Parameter individu dipisahkan oleh ampersand (&). Rentetan pertanyaan boleh digunakan untuk menghantar data tambahan antara halaman aplikasi individu.

Sebagai contoh, halaman hasil carian yang ditulis dalam PHP mungkin menggunakan URL seperti http://example.ru/results.php?item=shirt&author=andreyex . Dalam contoh ini, dua parameter tambahan melepasi hasil khayalan.php skrip aplikasi: item dengan nilai baju dan pengarang dengan nilai andreyex . Aplikasi boleh menggunakan maklumat rentetan pertanyaan untuk membina halaman yang betul untuk pelawat.

Peraturan penulisan semula Apache sering digunakan untuk memudahkan pautan yang panjang dan tidak sedap dipandang seperti di atas URL mesra, yang lebih mudah untuk menaip dan mentafsir secara visual. Dalam contoh ini, kami ingin memudahkan pautan di atas untuk membuat http://example.ru/shirt/andreyex . shirt dan nilai pengarang dan parameter andreyex ke alamat yang sama, tetapi tanpa rentetan pertanyaan dan nama skrip.

Berikut adalah satu peraturan untuk melaksanakan ini:

Contoh mudah

RewriteRule ^shirt/andreyex$ results.php?item=shirt&author=andreyex

shirt/andreyex secara eksplisit dipadankan dalam alamat yang diminta dan Apache diberitahu untuk menjalankan results.php?item=shirt&author=andreyex sebaliknya.

bendera biasanya digunakan dalam peraturan penulisan semula[. Mereka memberitahu Apache untuk menambah sebarang rentetan pertanyaan tambahan pada URL yang disediakan. Tanpa ini, rentetan pertanyaan tambahan akan dibuang. http://example.ru/shirt/andreyex?page=2 results.php?item=shirt&author=andreyex&page=2

Walaupun kaedah ini mencapai kesan yang diingini, kedua-dua nama elemen dan pengarang dikodkan keras ke dalam peraturan. Ini bermakna peraturan itu tidak akan berfungsi untuk mana-mana item lain seperti seluar atau pengarang seperti pemusnah.

Untuk menjadikan peraturan lebih umum, kita boleh menggunakan ungkapan biasa untuk memadankan sebahagian daripada alamat asal dan menggunakan bahagian tersebut dalam skema penggantian. Peraturan yang diubah suai akan kelihatan seperti ini:

Contoh mudah

RewriteRule ^(+)/(andreyex|pemusnah|jatuh|musim bunga) results.php?item=$1&author=$2

Ungkapan biasa pertama kumpulan dalam kurungan sepadan dengan rentetan yang mengandungi aksara dan nombor abjad angka, seperti baju atau seluar, dan menyimpan serpihan yang dipadankan sebagai pembolehubah $1 . Kumpulan kedua ungkapan dalam kurungan sepadan dengan tepat andreyex , pemusnah , musim luruh atau musim bunga dan juga menyimpan serpihan yang dipadankan sebagai $2 .

Coretan yang dipadankan kemudiannya berada dalam URL yang terhasil ke dalam pembolehubah item dan pengarang dan bukannya baju berkod keras dan andreyex yang kami gunakan sebelum ini.

Perkara di atas akan menukar, sebagai contoh, http://example.ru/pants/andreyex kepada http://example.ru/results.php?item=pants&author=andreyex . Contoh ini juga untuk masa hadapan, membenarkan berbilang elemen dan pengarang ditulis semula dengan betul menggunakan satu peraturan.

Contoh 2 - Menambah syarat dengan logik menggunakan RewriteConds

Peraturan penulisan semula tidak semestinya sentiasa dinilai satu demi satu tanpa sebarang sekatan. Arahan RewriteCond membolehkan kami menambah syarat pada peraturan penulisan semula kami untuk mengawal apabila peraturan diproses. RewriteConds mengikut format berikut:

Struktur umum RewriteCond

Keadaan RewriteCond TestString

  • RewriteCond mentakrifkan arahan RewriteCond.
  • TestString ialah rentetan yang akan diuji.
  • Keadaan ialah corak atau syarat untuk dipadankan.
  • Bendera ialah parameter pilihan yang boleh mengubah syarat dan peraturan penilaian.

Jika RewriteCond adalah benar, maka RewriteRule serta-merta selepas itu akan dipertimbangkan. Jika tidak, maka peraturan itu akan digugurkan. Berbilang RewriteCond boleh digunakan satu demi satu, dan dengan kelakuan lalai, mereka semua perlu menilai kepada benar dan dalam peraturan seterusnya untuk dipertimbangkan.

Sebagai contoh, katakan anda ingin mengubah hala semua permintaan untuk fail dan direktori yang tidak wujud di tapak anda kembali ke halaman utama dan bukannya menunjukkan halaman ralat standard. 404 Tidak Ditemui. Ini boleh dicapai dengan syarat peraturan berikut:

Ubah hala semua permintaan untuk fail dan direktori yang tidak wujud ke halaman utama

RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule . /

Memandangkan perkara di atas:

  • %(REQUEST_FILENAME) ialah rentetan untuk diuji. Dalam kes ini, nama fail yang diminta, iaitu pembolehubah sistem yang tersedia untuk setiap permintaan.
  • -f keadaan terbina dalam yang menyemak sama ada nama yang diminta wujud pada cakera dan merupakan fail. ! - Adakah pengendali penafian. Apabila digabungkan, !-f menilai kepada benar hanya jika nama yang ditentukan tidak wujud atau bukan fail.
  • Begitu juga, !-d menilai kepada benar hanya jika nama yang ditentukan tidak wujud atau bukan direktori.

RewriteRule pada baris terakhir hanya akan berkuat kuasa untuk permintaan untuk fail dan direktori yang tidak wujud. RewriteRule itu sendiri sangat mudah dan mengubah hala setiap permintaan ke /root tapak.

Pengeluaran

mod_rewrite ialah modul Apache berguna yang boleh digunakan dengan berkesan untuk menyediakan URL yang boleh dibaca manusia. Dalam pelajaran ini, anda mempelajari cara menggunakan arahan RewriteRule untuk mengubah hala URL, termasuk daripada rentetan pertanyaan. Anda juga mempelajari tentang pengalihan URL menggunakan arahan RewriteCond.

Fikirkan kembali lawatan terakhir anda ke kedai dalam talian. Apabila anda menemui produk yang betul, anda mungkin melihat sesuatu seperti URL ini:

Ini bukan kerana pembangun tapak ini menghabiskan banyak masa untuk menyediakan direktori berasingan untuk kategori produk yang berbeza, tetapi terima kasih kepada modul berguna yang dipanggil mod_rewrite. Modul ini membolehkan anda membuat URL tersuai dan dipermudahkan. URL sebenarnya kelihatan seperti ini:

http://www.buy-online.com/gp/itemB004RYVI0Q/ref=as_li_ss_tl?

Tutorial ini meliputi mendayakan modul ini, mencipta dan menggunakan halaman .htaccess dan menyediakan penulisan semula URL.

Keperluan

Juga, anda perlu memasang apache terlebih dahulu. Untuk memasang pelayan web ini dengan cepat pada Ubuntu, gunakan arahan:

sudo apt-get install apache2

1: Dayakan mod_rewrite

Mula-mula anda perlu mendayakan mod_rewrite, ia sangat mudah:

sudo a2enmod tulis semula

Perintah ini akan mendayakan modul, atau memaparkan mesej "Tulis semula modul sudah didayakan" jika modul sudah didayakan.

2: Apakah itu .htaccess?

Setelah modul telah diaktifkan, anda boleh menyediakan penulisan semula pautan dengan mencipta fail .htaccess dalam direktori tapak.

Fail .htaccess ialah cara untuk memperhalusi tapak tanpa perlu menukar fail konfigurasi pelayan. Titik yang memulakan nama fail bermakna fail itu tersembunyi.

Selain itu, lokasi fail .htaccess adalah penting, kerana tetapan fail ini akan mempengaruhi semua fail dan subdirektori direktori di mana ia berada.

Anda boleh mencipta fail .htaccess menggunakan editor teks, dan kemudian memuat naiknya ke tapak menggunakan klien ftp.

catatan: fail mesti dinamakan tepat .htaccess; Nama fail tidak boleh mengandungi sambungan tambahan.

Sebagai alternatif, anda boleh mencipta fail .htaccess melalui terminal menggunakan arahan ini, menggantikan example.com dengan nama domain tapak.

Termasuk fail .htaccess

Untuk membenarkan fail .htaccess mengatasi tetapan tapak lalai, buka fail konfigurasi.

Catatan: Ini memerlukan keistimewaan sudo yang dilanjutkan.

sudo nano /etc/apache2/sites-available/default

Dalam fail ini, cari bahagian berikut dan tukar nilai baris AllowOverride (gantikan Tiada dengan Semua). Akibatnya, bahagian akan kelihatan seperti ini:


Indeks Pilihan FollowSymLinks MultiViews
AllowOverride Semua
perintah benarkan, tolak
izinkan dari semua

Selepas menyimpan perubahan dan menutup fail, mulakan semula pelayan apache. Fail .htacess kini tersedia untuk semua tapak pada pelayan.

sudo service apache2 restart

Kini anda sudah bersedia untuk menulis semula URL tapak.

Langkah 3: Menulis semula URL

Keseluruhan operasi penulisan semula URL berlaku dalam fail .htaccess. Secara umum, semua arahan penulisan semula URL mengikut corak yang sama:

Penggantian Corak RewriteRule

Pilihan yang digunakan dalam arahan ini:

  • RewriteRule: Ini ialah bahagian di mana anda boleh menetapkan arahan yang diperlukan.
  • Corak: Bahagian ini adalah untuk mentafsir URL yang dikehendaki menggunakan ungkapan biasa. Panduan ini tidak merangkumi ungkapan biasa; beberapa maklumat berguna mengenai perkara ini boleh didapati di tapak Apache.
  • Penggantian: Memaparkan URL sebenar halaman. Pautan sedemikian sukar diingat kerana ia terdiri daripada parameter PHP atau urutan nombor yang panjang, contohnya: www.bestshop.com/gadgets.php?innovation=laptops
  • Bendera Pilihan: Bendera ialah teg pada penghujung arahan RewriteRule yang boleh mengubah tingkah laku ungkapan. Beberapa bendera biasa ialah: [F] tidak membenarkan URL, mengabaikan huruf besar atau mengawal kod ubah hala yang digunakan, [L] mengatakan ia adalah peraturan terakhir dalam satu siri.

Contoh Tulis Semula URL

Contoh 1: buka halaman A - pergi ke halaman B

Ini ialah contoh paling mudah penulisan semula URL: pelawat tapak memasukkan satu URL ke dalam penyemak imbas tetapi diubah hala ke yang lain. Untuk mengkonfigurasi tingkah laku ini, ikut arahan dalam bahagian ini.

Untuk bermula, buat dua halaman tapak web; contohnya, yang pertama ialah tentang epal (apples.html) dan yang kedua ialah tentang oren (oranges.html).

Salin kod ini:



buah epal


Halaman ini adalah mengenai Epal



Kemudian buat halaman kedua (dalam kes ini, halaman oren). Untuk melakukan ini, cuma gantikan Apple dalam blok kod ini dengan Oren.

Kemudian buka fail .htaccess:

sudo nano /var/www/example.com/.htaccess

Masukkan arahan tulis semula URL berikut ke dalamnya:

Tulis semula Enjin hidup
RewriteRule ^oranges.html$ apples.html

Simpan dan tutup fail.

Kemudian lawati halaman /oranges.html, ia akan mengandungi maklumat halaman /apples.html.

Mari kita lihat dengan lebih dekat arahan di atas:

  • ^oranges.html: Menentukan cara halaman yang diingini bermula. Karet (^) menunjukkan permulaan baris. Dalam erti kata lain, jika halaman yang URLnya perlu ditulis semula telah bermula secara berbeza (contohnya, bukan oranges.html, tetapi oranges_1.html), ia tidak akan sepadan dengan peraturan penulisan semula dan tidak akan diubah hala ke halaman birds.html.
  • $: Tanda dolar diletakkan di hujung URL. Sekali lagi, jika rentetan berakhir secara berbeza (contohnya, mengandungi sebarang aksara selepas aksara terakhir yang diisytiharkan), halaman web tidak akan dikenali oleh peraturan penulisan semula.
  • apples.html: Halaman ini adalah tempat penyemak imbas menghantar trafik.

Contoh 2: Parameter sebagai subdirektori dalam URL

Semak url:

http://example.com/results.php?products=apple

Ia akan menjadi lebih jelas sebagai:

http://example.com/products/apple

Untuk melakukan ini, tambahkan baris berikut pada .htaccess:

Tulis semula Enjin hidup
RewriteRule ^products/(+)/?$results.php?products=$1

Baris ini terdiri daripada pilihan berikut:

  • ^produk: Dalam kes ini, URL mesti bermula dengan perkataan produk untuk diubah hala (perhatikan bahawa ini hanya digunakan pada teks selepas domain). Sekali lagi, jika URL bermula secara berbeza, peraturan itu tidak akan digunakan.
  • (+): Teks kurungan ini menunjukkan bahawa URL boleh menjadi sebarang aksara. Tanda tambah menunjukkan bahawa satu atau lebih aksara boleh berada dalam kurungan.
  • /?$: Tanda dolar menandakan penghujung baris. Tanda soal membolehkan anda meletakkan garis miring di hujung baris (walaupun ini tidak diperlukan).
  • : Ini ialah bendera di penghujung frasa, menunjukkan bahawa peraturan harus mengabaikan kes semua aksara.

Contoh 3: Menyediakan pautan bersih

Ciri ini amat diperlukan jika URL tapak terlalu panjang atau kompleks.

Sebagai contoh, ambil URL berikut:

http://example.com/results.php?products=produce&type=fruit&species=apple

http://example.com/produce/fruit/apple

Untuk melakukan ini, tambahkan baris berikut pada .htaccess (by the way, .htaccess boleh mengandungi nombor tanpa had bahagian tersebut):

Tulis semula Enjin hidup
RewriteRule ^(daging|hasilkan|dairy)/([^/.]+)/([^/.]+)$ results.php?products=$1&type=$2&spesies=$3

Mari kita lihat lebih dekat pada kod ini:

  • Karet (^ aksara) menunjukkan permulaan ungkapan.
  • (daging|hasil|tenusu): Untuk menyekat pilihan yang boleh dipaparkan, masukkan hanya nilai yang dibenarkan dalam kurungan (daging, hasil dan tenusu dalam kes ini). Jika URL mengandungi parameter yang tidak dikurung, penulisan semula akan gagal.
  • ([^/.]+) menunjukkan bahawa segala-galanya kecuali aksara selepas karet (dalam kes ini, garis miring dan noktah) boleh dipotong.
  • results.php?products=$1&type=$2&species=$3: setiap nilai dalam kurungan akan diekstrak dan kemudian dimasukkan ke dalam URL yang lebih panjang dalam bahagian penggantian. $1 bermaksud kurungan pertama, $2 untuk yang kedua, $3 untuk yang ketiga.

Sambungan artikel boleh didapati.

Tag: ,

Panduan ini akan membantu anda menyediakan penulisan semula URL pada Apache2 menggunakan modul mod_rewrite. Alat ini membolehkan anda menulis semula URL dan membuat pautan bersih dengan menukar laluan kompleks kepada pautan yang jelas dan boleh dibaca.

Keperluan

  • Pelayan Ubuntu 14.04.
  • Pengguna dengan akses sudo (butiran boleh didapati dalam manual).

Langkah 1 Memasang Apache

Apache boleh dipasang menggunakan pengurus pakej apt-get.

Mula-mula anda perlu mengemas kini indeks pakej:

sudo apt-get kemas kini

Apache ialah pelayan web modular yang popular (iaitu, ia membolehkan anda menyesuaikan ciri dengan mendayakan dan melumpuhkan modul). Untuk memasang Apache 2, taip:

sudo apt-get install apache2

Pelayan Apache berjaya dipasang.

Sekarang kita perlu fokus pada modul.

2: modul mod_rewrite

Untuk mendayakan mod_rewrite, taip:

sudo a2enmod tulis semula

Perintah akan membolehkan modul dan memberitahu anda bahawa modul sedang berjalan. Untuk mengemas kini tetapan pelayan web, mulakan semula:

sudo service apache2 restart

Langkah 3: Cipta Fail .htaccess

Sekarang kita perlu menulis fail .htaccess yang akan menguruskan penulisan semula.

Fail .htaccess mentakrifkan arahan Apache individu untuk setiap domain individu.

Catatan: Di Linux, nama fail tersembunyi bermula dengan titik.

Mula-mula anda perlu mendayakan sokongan untuk fail .htaccess. Untuk melakukan ini, edit arahan AllowOverride dalam fail konfigurasi Apache. Buka fail:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Cari blok dan tambahkan blok berikut kepadanya:

etc/apache2/sites-available/default

Indeks Pilihan FollowSymLinks MultiViews
AllowOverride Semua
perintah benarkan, tolak
izinkan dari semua

Sekarang fail konfigurasi pelayan web sepatutnya kelihatan seperti ini:

/etc/apache2/sites-available/default


. . .

. . .

Untuk mengemas kini tetapan, mulakan semula Apache.

sudo service apache2 restart

Buat fail .htaccess:

Tambahkan baris ini pada permulaan fail baharu untuk mengaktifkan RewriteEngine:

Tulis semula Enjin hidup

Simpan dan tutup fail. Ini akan membolehkan Apache memproses peraturan penulisan semula.

Pengguna lain sepatutnya hanya mempunyai akses baca kepada .htaccess. Tukar kebenaran fail:

sudo chmod 644 /var/www/html/.htaccess

4: Tulis ganti persediaan

Bahagian ini akan menunjukkan kepada anda cara menyediakan penulisan semula URL asas. Pautan example.com/about digunakan sebagai contoh.

Buat fail about.html:

sudo nano /var/www/html/about.html

Salin kod berikut dan letakkan dalam fail:



Tentang kita


Tentang kita



Ambil perhatian bahawa hanya about.html boleh diakses. Jika anda memasukkan pautan server_ip_address /about, anda akan mendapat ralat 404 Not Found. Buat peraturan tulis semula untuk membetulkannya.

Buka fail .htaccess:

sudo nano /var/www/html/.htaccess

Tambahkan baris berikut padanya:

RewriteRule ^about$ about.html

Fail kini mengandungi tetapan berikut:

Tulis semula Enjin hidup
RewriteRule ^about$ about.html

Penyemak imbas kini sepatutnya dapat menyediakan halaman example.com/about.

Menggunakan peraturan ini sebagai contoh, kita boleh mempertimbangkan sintaks umum penulisan semula.

  • ^about$ ialah corak yang dipadankan oleh URL dan yang pengguna masukkan dalam penyemak imbas. Dalam contoh ini, metacharacter digunakan untuk menunjukkan dengan jelas lokasi corak: aksara ^ menunjukkan permulaan corak dan $ penghujung.
  • about.html: Laluan sumber ke halaman tempat fail about.html dihidangkan.
  • : Bendera yang melumpuhkan kepekaan huruf besar-kecil URL.

Mengikut peraturan ini, halaman boleh diakses melalui pautan berikut:

example.com/about
example.com/Perihal
example.com/about.html

example.com/about/
example.com/contact

Templat Umum

Jadi sekarang anda tahu asas menulis peraturan menulis semula. Mari kita lihat dua contoh tambahan.

Catatan: Untuk ujian, anda boleh membuat beberapa fail tambahan.

Contoh 1: Memudahkan Rentetan Pertanyaan dengan RewriteRule

Peraturan RewriteRule mempunyai format berikut:

Penggantian corak RewriteRule

  • RewriteRule: arahan.
  • corak: ungkapan biasa yang menentukan corak untuk mencari rentetan.
  • penggantian: URL sasaran
  • bendera: parameter pilihan yang mengubah tingkah laku peraturan.

Aplikasi sering menggunakan rentetan pertanyaan. Rentetan ini berada dalam URL, bermula dengan tanda soal (?) dan berakhir dengan ampersand (&). Apabila memproses peraturan penulisan semula, Apache mengabaikan kedua-dua aksara ini. Sebagai contoh, URL halaman hasil carian yang ditulis dalam PHP mungkin kelihatan seperti ini:

http://example.com/results.php?item=shirt&season=summer

Sudah tentu, pengguna akan lebih selesa jika pautan itu bersih:

http://example.com/shirt/summer

Ini boleh dicapai dalam dua cara: dengan penggantian mudah atau pengelompokan parameter.

1: Penggantian mudah

Buat peraturan yang melakukan penggantian mudah untuk menjadikan pautan bersih:

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

Peraturan ini akan menggunakan baju/musim panas dan bukannya hasil.php?item=shirt&season=summer.

2: Pemetaan dan pengelompokan

Dalam sesetengah situasi, anda perlu mengoptimumkan rentetan pertanyaan (contohnya, untuk memasukkan semua musim). Untuk ini anda perlukan:

  • Tentukan satu set pilihan dengan mengasingkannya dengan aksara paip | (logik ATAU operator).
  • Kumpulkan semua parameter yang diberikan menggunakan kurungan () dan kemudian rujuk kumpulan menggunakan pembolehubah $1 (dengan 1 ialah nombor kumpulan parameter).

Ini akan menghasilkan peraturan berikut:

RewriteRule ^kemeja/(musim panas|musim sejuk|musim luruh|musim bunga) results.php?item=shirt&season=$1

Peraturan ini menambahkan segmen baharu pada URL.

3: Padankan set watak

Untuk membolehkan pengguna membuka URL bersih mana-mana bahagian tapak (bukan sahaja / baju), anda perlu:

  • Tulis ungkapan biasa yang sepadan dengan semua aksara alfanumerik. Tanda kurung segi empat sama menunjukkan corak carian (dalam kes ini, ia termasuk semua aksara), dan aksara + menunjukkan bahawa setiap aksara dalam corak boleh diulang tanpa had kali.
  • Kumpulkan set aksara ini dan berikannya $2.

RewriteRule ^(+)/(musim panas|musim sejuk|musim luruh|musim bunga) keputusan.php?item=$1&season=$2

http://example.com/results.php?item=pants&season=summer

http://example.com/pants/summer

4: Rentetan pertanyaan tambahan

Ini akan membolehkan anda menghapuskan beberapa masalah yang berpotensi. Cuba tukar:

http://example.com/pants/summer?page=2

http://example.com/results.php?item=pants&season=summer&page=2

Dengan tetapan semasa, anda tidak akan dapat menavigasi ke halaman=2. Ini boleh diperbaiki dengan bendera QSA, yang membolehkan rentetan pertanyaan digabungkan. Edit peraturan seperti berikut:

RewriteRule ^(+)/(musim panas|musim sejuk|musim luruh|musim bunga) keputusan.php?item=$1&season=$2

Contoh 2: Syarat RewriteCond

Sekarang mari kita lihat dengan lebih dekat arahan RewriteCond. RewriteCond mempunyai format berikut:

Keadaan RewriteCond TestString

  • RewriteCond: arahan.
  • TestString: Rentetan untuk dibandingkan.
  • Keadaan: Corak yang digunakan untuk membandingkan rentetan.
  • Bendera: pilihan tambahan.

Jika RewriteCond adalah benar, Apache akan memproses RewriteRule berikut.

1: Halaman Lalai

Anda melihat lebih awal bahawa jika halaman yang diminta tidak wujud, Apache mengembalikan halaman ralat 404 Not Found. Walau bagaimanapun, Apache sebaliknya boleh mengubah hala semua permintaan tersebut ke halaman utama. Tambahkan syarat berikut untuk memastikan fail yang diminta wujud:

RewriteCond %(REQUEST_FILENAME) !-f
RewriteRule ^admin/(.*)$ /admin/home

Pertimbangkan peraturan di atas dalam bahagian:

  • %(REQUEST_FILENAME) menyemak rentetan yang diminta.
  • !-f: pengendali! (tidak) menyatakan bahawa jika fail yang diminta tidak wujud, pelayan web harus melaksanakan peraturan ubah hala seterusnya.
  • RewriteRule mengubah hala permintaan ke /admin/home.

Anda juga boleh menetapkan ErrorDocument yang mana semua permintaan untuk halaman yang tidak wujud akan dihantar. Buat peraturan ErrorDocument dan ubah hala semua 404 ralat ke halaman error.html:

ErrorDocument 404 /error.html

2: Hadkan akses melalui IP

RewriteCond membolehkan anda menyekat akses ke tapak dengan alamat IP.

Sebagai contoh, peraturan ini akan menyekat semua trafik kecuali 12.34.56.789:

RewriteCond %(REMOTE_ADDR) !^(12\.34\.56\.789)$
RewriteRule(.*) -

Apa lagi yang perlu dibaca