apache mod_rewrite: menggunakan database untuk memperbarui aturan penulisan ulang

Total pemula di mod_rewrite.

Katakanlah saya ingin membuat URL yang bagus untuk setiap produsen di situs saya, jadi saya punya www.mysite.com/samsung www.mysite.com/sony www.mysite.com/acme

bekerja dengan cukup baik.

Namun, jika saya memiliki ratusan produsen dan mereka terus berubah, lalu bagaimana? Ada beberapa referensi yang tidak jelas untuk sesuatu yang disebut menulis ulang peta di suatu tempat tetapi tidak ada yang menjelaskannya dan tidak ada tutorial. Adakah yang bisa membantu?

Juga, mengapa masalah ini bukan topik utama yang dibahas dalam tutorial mod_rewrite? Bagaimana mod_rewrite mungkin berguna ketika Anda harus memeliharanya secara manual (dengan asumsi Anda memiliki konten baru di situs Anda sesekali)?

Ada juga yang menyebutkan perlunya akses ke httpd.conf Bagaimana cara mengakses httpd.conf di server penyedia hosting saya? Bagaimana situs lain melakukan hal ini?

Terima kasih


person A-OK    schedule 28.11.2010    source sumber


Jawaban (2)


Cara yang biasanya dilakukan adalah Anda mengambil semua URL yang cocok dengan pola tertentu dan merutekannya ke file PHP (atau apa pun bahasa pemrograman sisi server Anda) untuk perutean yang lebih kompleks. Sesuatu seperti ini:

RewriteRule ^(.*)$ myroute.php?url=$1 [QSA,L]

Kemudian, di file myroute.php, Anda dapat menyertakan logika untuk melihat parameter string kueri "url", karena parameter tersebut akan berisi URL asli yang masuk. Mungkin Anda dapat mencocokkannya dengan pabrikan dalam database, atau apa pun yang diperlukan.

Contoh ini jelas mengambil semua URL dan memetakannya ke myroute.php. Contoh lain mungkin seperti:

RewriteRule ^/manufacturers/(.*)$ manuf.php?name=$1 [QSA,L]

Dalam hal ini, ini akan memetakan URL seperti ini:

/manufacturers/sony => /manuf.php?name=sony
/manufacturers/samsung => /manuf.php?name=samsung
dll...

Dalam hal ini, file manuf.php Anda dapat mencari database berdasarkan parameter string kueri name.

person Dean Harding    schedule 29.11.2010
comment
oke, itu tidak terpikir olehku... terima kasih :) tapi lalu bagaimana? cara merutekannya melalui header() ke URL yang tepat? bagaimana cara menyimpan URL cantik? - person A-OK; 29.11.2010
comment
@ A-OK Jika mod_rewrite dapat menggunakan pengalihan internal sehingga pengguna akan melihat URL cantik pra-penulisan ulang. Contoh yang tidak bisa dilakukan adalah saat tujuan berada di host terpisah atau saat Anda secara eksplisit memerintahkannya untuk menggunakan pengalihan HTTP. - person Laurence Gonsalves; 29.11.2010
comment
Saya bertanya sehubungan dengan contoh di atas. Jika penulisan ulang mengalihkan semua URL ke file myroute.php yang kemudian mengarahkannya lebih jauh melalui header() (saya tidak tahu bagaimana lagi), URL mana yang akan terlihat setelah pengguna tiba di halaman yang tepat? - person A-OK; 29.11.2010
comment
File myroute.php hanya dapat include file yang diperlukan untuk pemrosesan aktual (tidak benar-benar melakukan pengalihan), setelah berhasil menentukan file mana yang seharusnya melakukan pekerjaan tersebut. Jika Anda menggunakan contoh manuf.php kedua, maka tidak ada pengalihan tambahan, manuf.php akan melakukan semua pekerjaan secara langsung. - person Dean Harding; 29.11.2010
comment
Terima kasih, itu masuk akal. Sayangnya saya tidak dapat menggunakan pengaturan semacam itu untuk apa yang saya inginkan, tetapi saya akan menggunakannya di masa mendatang saat membuat situs dari awal. - person A-OK; 29.11.2010

Baru saja menemukan jawaban ini ketika mencari solusi serupa - mencari lebih jauh saya menemukan bahwa mod_rewrite sekarang memiliki RewriteMap, yang akan melakukan apa yang Anda inginkan tanpa perlu menjalankan PHP atau bahasa skrip lainnya.

Ini memungkinkan Anda menentukan aturan pemetaan dengan file teks, file DBM, skrip eksternal, atau kueri SQL.

Saya harap itu membantu!

person Jez    schedule 10.12.2012
comment
Wow, terima kasih, inilah yang saya butuhkan. Khususnya baris ini tentang peta teks biasa : Jadi, ketika example.com/product/television diminta, RewriteRule diterapkan, dan permintaan dipetakan secara internal ke example.com/prods.php?id=993 - person cnlevy; 12.08.2016