Apache: Apa cara terbaik untuk menangani ribuan pengalihan permanen?

20

Kami memiliki daftar 3000 301 pengalihan. Kami butuh bantuan

  1. Apa tempat terbaik untuk meletakkan ini? Tampaknya menempatkan 3000 baris ini di dalam vhost di httpd.conf akan berantakan.
  2. Apa cara yang disarankan untuk menangani ribuan url?
  3. Seberapa besar pengaruhnya terhadap kecepatan pemuatan halaman dan pemuatan server apache?

Terima kasih.

ucker
sumber

Jawaban:

29

Anda dapat menggunakan Includearahan dalam httpd.confuntuk dapat mempertahankan arahan ulang di file lain. Tetapi itu tidak akan sangat efisien, karena setiap permintaan perlu diperiksa terhadap banyak ekspresi reguler. Juga server restart akan diperlukan setelah setiap perubahan dalam file.

Cara yang lebih baik untuk begitu banyak pengalihan adalah dengan menggunakan jenis pengarahan RewriteMapdbm untuk mendeklarasikan peta dari URI ke pengalihan. Dengan cara ini akan efisien, karena pencarian dbm sangat cepat, dan setelah perubahan peta Anda tidak perlu me-restart server, karena httpdmemeriksa waktu modifikasi file peta.

Aturan penulisan ulang akan terlihat seperti ini (diuji pada komputer Fedora 16 saya):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

Dan peta dbm akan dibuat dari peta teks yang /etc/httpd/conf/redirects.txttampak seperti ini:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

menggunakan perintah

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
Tometzky
sumber
Terima kasih atas jawabannya. Saya mencobanya tetapi mendapatkan kesalahan: konten file satu baris redirects.txt saya (nilai yang dipisahkan spasi) mydomain.com/experiment mydomain.com/new_page Ini memberi saya kesalahan parse on line 'RewriteCond $ {redirects: $ 1}! = ""' . Kesalahan sintaks pada baris 314 dari /usr/local/apache/conf/httpd.conf: RewriteCond: pembatas flag yang buruk Saya berkomentar keluar dan kemudian apache mulai tetapi mengunjungi mydomain.com/experiment (atau url lain dari mydomain) memberi saya kesalahan "permintaan sedang dialihkan dengan cara yang tidak dapat diselesaikan".
ucker
Apache tidak memulai kembali dengan cuplikan di atas. Bisakah Anda membantu? Saya tidak dapat melihat kesalahan yang terkait dengan ini di salah satu file log.
ucker
Saya mengatakan itu belum teruji - saya berharap akan perlu sedikit penyesuaian. Saya pikir itu sudah cukup, maaf. Httpd tidak memulai karena tidak ada ruang di antara !=dan ""- Saya telah memperbaiki contoh saya ke versi yang berfungsi dan diuji sekarang.
Tometzky
Satu komentar lagi: Anda harus menggunakan pendekatan yang berbeda jika pengalihan Anda harus bergantung pada string kueri (semuanya setelah ?di URL), tetapi itu juga mungkin . Seperti sekarang ini hanya akan menambahkan string kueri ke redirect, misalnya http://yourserver.com/foo?q=barakan dialihkan ke http://serverfault.com/?q=bar.
Tometzky
Terima kasih atas pembaruannya. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbmemberi kesalahan RewriteMap dbm type db is invalid. Tetapi ketika saya menggunakannya RewriteMap redirects txt:/etc/httpd/conf/redirects.txtitu berhasil. Saya masih ingin pergi dengan cara hash seperti yang Anda jelaskan daripada teks biasa. Tetapi saya tidak dapat menemukan banyak tentang kesalahan dbm. Terima kasih atas bantuan Anda.
ucker
2

Saya akan menulis skrip yang menghasilkan VHOST baru hanya dengan tautan dari daftar.

Lucas Kauffman
sumber