Apache: cách tốt nhất để xử lý hàng ngàn chuyển hướng vĩnh viễn là gì?


20

Chúng tôi đã có một danh sách 3000 chuyển hướng 301. Chúng tôi cần hỗ trợ về

  1. Điều gì sẽ là nơi tốt nhất để đặt những thứ này? Có vẻ như đặt 3000 dòng này bên trong vhost trong httpd.conf sẽ là một mớ hỗn độn.
  2. Những cách được đề xuất để xử lý hàng ngàn url là gì?
  3. Bao nhiêu nó sẽ ảnh hưởng đến tốc độ tải trang và tải máy chủ apache?

Cảm ơn.

Câu trả lời:


29

Bạn có thể sử dụng Includechỉ thị httpd.confđể có thể duy trì chuyển hướng trong một tệp khác. Nhưng nó sẽ không hiệu quả lắm, vì mọi yêu cầu sẽ cần phải được kiểm tra đối với nhiều biểu thức thông thường. Ngoài ra, một máy chủ khởi động lại sẽ được yêu cầu sau mỗi thay đổi trong tệp.

Một cách tốt hơn cho rất nhiều chuyển hướng sẽ là sử dụng chỉ thị loại RewriteMapdbm để khai báo bản đồ từ URI sang chuyển hướng. Bằng cách này, nó sẽ hiệu quả, vì việc tra cứu dbm rất nhanh và sau khi thay đổi bản đồ, bạn sẽ không cần phải khởi động lại máy chủ, vì httpdkiểm tra thời gian sửa đổi tệp bản đồ.

Một quy tắc viết lại sẽ trông như thế này (được thử nghiệm trên máy tính Fedora 16 của tôi):

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

Và bản đồ dbm sẽ được tạo từ bản đồ văn bản /etc/httpd/conf/redirects.txttrông như thế này:

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

sử dụng một lệnh

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db

Cảm ơn câu trả lời. Tôi đã thử nó nhưng gặp lỗi: nội dung tệp redirects.txt của tôi (giá trị được phân tách bằng dấu cách) mydomain.com/experiment mydomain.com/new_page Nó đã cho tôi lỗi phân tích cú pháp trên dòng 'RewriteCond $ {redirects: $ 1}! = ""' . Lỗi cú pháp trên dòng 314 của /usr/local/apache/conf/httpd.conf: RewriteCond: dấu phân cách cờ xấu Tôi đã nhận xét rằng sau đó apache bắt đầu nhưng truy cập mydomain.com/experiment (hoặc bất kỳ url nào khác từ mydomain) "Yêu cầu đang được chuyển hướng theo cách không thể hoàn thành".
ucker

Apache không bắt đầu lại với đoạn trích trên. Bạn có thể giúp? Tôi không thể thấy bất kỳ lỗi nào liên quan đến điều này trong bất kỳ tệp nhật ký nào.
ucker

Tôi nói nó chưa được kiểm tra - tôi dự đoán rằng nó sẽ cần một số điều chỉnh. Tôi nghĩ rằng nó sẽ là đủ, xin lỗi. Httpd không bắt đầu vì không thể có khoảng cách giữa !=""- Tôi đã sửa ví dụ của mình thành phiên bản đã được thử nghiệm và đang hoạt động.
Tometzky

Thêm một nhận xét: bạn cần sử dụng một cách tiếp cận khác nếu chuyển hướng của bạn cần phụ thuộc vào chuỗi truy vấn (mọi thứ sau ?trong URL), nhưng cũng có thể . Vì bây giờ nó chỉ cần thêm chuỗi truy vấn để chuyển hướng, ví dụ như http://yourserver.com/foo?q=barsẽ chuyển hướng đến http://serverfault.com/?q=bar.
Tometzky

Cảm ơn các cập nhật. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dbđã đưa ra lỗi RewriteMap dbm type db is invalid. Nhưng khi tôi sử dụng RewriteMap redirects txt:/etc/httpd/conf/redirects.txtnó đã làm việc. Tôi vẫn muốn đi theo cách băm như bạn đã giải thích thay vì văn bản đơn giản. Nhưng tôi không thể tìm thấy nhiều về lỗi dbm. Cảm ơn bạn đã giúp đỡ.
ucker

2

Tôi sẽ viết một tập lệnh tạo VHOST mới chỉ bằng các liên kết từ danh sách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.