2009-07-22 37 views
6

Tôi đang cố gắng viết một tập hợp các quy tắc mod_rewrite cho phép người dùng của tôi sử dụng một thư mục duy nhất để phát triển các dự án khác nhau và không phải gây rối với việc thêm vhost cho mọi dự án.Apache mod_rewrite tên miền phụ vào thư mục con (thông qua chuyển hướng nội bộ)

Ý tưởng của tôi để thực hiện điều này, là thiết lập "VHost toàn cầu" cho mỗi người dùng duy nhất cần khả năng này (chỉ 3-4), vhost sẽ giống như: .my-domain.com. Từ đó, tôi muốn quảng bá người dùng của tôi để viết mã như thể nó nằm trên một tên miền, chứ không phải trong một thư mục con. Ví dụ: nếu bob đang làm việc trên một dự án có tên 'gnome', tôi muốn URL bob (và bất kỳ ai khác trên mạng nội bộ của chúng tôi) tải để truy cập dự án này là: http://gnome.bob.my-domain.com. Nhưng, những gì tôi muốn Apache làm, là nhận ra rằng "gnome" là một "dự án" và do đó ánh xạ yêu cầu, nội bộ, đến bob.my-domain.com/gnome/.

Tôi đã có những gì tôi nghĩ rằng sẽ làm việc, và nó khá đơn giản, nhưng .. nó không hoạt động! Yêu cầu chỉ đi vào một vòng lặp vô hạn và giữ tiền tố tên miền phụ lên URI yêu cầu được viết lại.

Mã viết lại mod tôi có là:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI} !^/%1.* 
RewriteRule ^(.*)$  /%1/$1 [L] 

Tôi đã googled xung quanh một chút về vấn đề này, nhưng tôi chưa tìm thấy bất kỳ giải pháp thực sự mà làm việc. Có ai đã thử điều này - hoặc có thể, có ai có ý tưởng tốt hơn không? Một điều không liên quan đến việc tạo một máy chủ ảo cho mọi dự án (tôi có thiết kế..Tôi nghĩ mọi người sẽ đồng ý rằng một nhà thiết kế không nên tạo máy chủ ảo ..)

Cảm ơn!

Dưới đây là một đoạn trích từ rewrite_log:

[rid#838dc88/initial] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/index.html -> index.html 
[rid#838dc88/initial] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'index.html' 
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^.]+)\.bob\.my-domain\.com' => matched 
[rid#838dc88/initial] (4) [perdir /home/bob/http/] RewriteCond: input='/index.html' pattern='!^/%1.*' => matched 
[rid#838dc88/initial] (2) [perdir /home/bob/http/] rewrite 'index.html' -> '/gnome/index.html' 
[rid#838dc88/initial] (1) [perdir /home/bob/http/] internal redirect with /gnome/index.html [INTERNAL REDIRECT] 
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] strip per-dir prefix: /home/bob/http/gnome/index.html -> gnome/index.html 
[rid#8392f30/initial/redir#1] (3) [perdir /home/bob/http/] applying pattern '^(.*)$' to uri 'gnome/index.html' 
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='gnome.bob.my-domain.com' pattern='^([^\.]+)\.bob\.my-domain\.com' => matched 
[rid#8392f30/initial/redir#1] (4) [perdir /home/bob/http/] RewriteCond: input='/gnome/index.html' pattern='!^/%1.*' => matched 
[rid#8392f30/initial/redir#1] (2) [perdir /home/bob/http/] rewrite 'gnome/index.html' -> '/gnome/gnome/index.html' 
[rid#8392f30/initial/redir#1] (1) [perdir /home/bob/http/] internal redirect with /gnome/gnome/index.html [INTERNAL REDIRECT] 
[rid#8397970/initial/redir#2] (3) [perdir /home/bob/http/] add path info postfix: /home/bob/http/gnome/gnome -> /home/bob/http/gnome/gnome/index.html 

Đây chỉ là một đoạn mã, có một vài 10s hoặc 100 hoặc lâu hơn dòng apache cơ bản viết lại /gnome/index.html đến/gnome/gnome /gnome/gnome/gnome/index.html, vv trước apache lượt truy cập giới hạn viết lại nó, từ bỏ, và ném lỗi 500

+0

Đã thêm một số thông tin khác từ nhật ký viết lại, hy vọng ai đó đã thử điều này trước đây hoặc có một số đầu vào về cách tôi có thể thực hiện việc này! Thanks guys (and gals) –

Trả lời

5

Sau một vài năm bỏ qua vấn đề này và trở lại tại các điểm khác nhau, cuối cùng tôi đã tìm thấy một giải pháp khả thi.

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %1::%{REQUEST_URI} !^(.*?)::/\1/ 
RewriteRule ^(.*)$ /%1/$1 [L] 

gì tôi thấy được rằng back-tài liệu tham khảo cho RewriteCond hướng trước không có sẵn trong các thông số ConditionPattern của RewriteConditions tương lai. Nếu bạn muốn sử dụng tham chiếu ngược từ chỉ thị trước RewriteCond, bạn chỉ có thể sử dụng tham chiếu đó trong tham số TestString.

Các chỉ thị ở trên sẽ thêm tên miền phụ phù hợp trong chỉ thị RewriteCond thứ nhất vào RequestURI, được giới hạn bởi ::. Những gì chúng ta làm trong chuỗi kiểm tra RewriteCond (regex) là chụp lại tên miền phụ, sau đó kiểm tra để đảm bảo RequestURI thực sự của chúng tôi không bắt đầu bằng tên miền phụ đó dưới dạng thư mục sử dụng tham chiếu ngược trong cùng một regex .

Điều này nghe có vẻ khó hiểu hơn nhiều so với thực tế, và tôi không thể lấy tín dụng để khám phá câu trả lời. Tôi đã tìm thấy câu trả lời dưới dạng câu trả lời cho một câu hỏi khác tại đây, %N backreference inside RewriteCond. Cảm ơn Jon Lin vì đã trả lời câu hỏi đó và không biết anh ấy, câu hỏi của tôi nữa!

+0

Chỉ cần một lưu ý rằng tôi đã phải loại bỏ dấu/trên RewriteCond thứ hai để làm cho nó hoạt động đúng cho tôi. Tôi đã có thể tải URL của tôi với nó (cài đặt gallery3), nhưng tài nguyên CSS không tải đúng cách. Cất bỏ dấu gạch chéo cố định nó. Có vẻ như nó đã kết thúc bằng // trong URL với nó trong đó. – stuckj

0

Một số câu hỏi:

bạn nói "đồ nội" - bạn kHÔNG muốn sử dụng chuyển hướng?

Bạn đang sử dụng VirtualHost tương tự cho gnome.bob.mysite.combob.mysite.com

Bạn có nhớ để tạo ra một ServerAlias ​​cho *.bob.mysite.com?


Đây là phiên bản thô mà bạn có thể sửa đổi để hoạt động. Nó sẽ nắm bắt tên miền phụ và URL được yêu cầu, và chuyển hướng đến miền chính với tên miền phụ như phần đầu tiên của đường dẫn, theo sau là đường dẫn được yêu cầu, theo sau là chuỗi truy vấn.

ServerName www.mysite.com 
ServerAlias *.mysite.com 

RewriteCond %{HTTP_HOST} ^([a-zA-Z0-9-]+)\\.mysite.com$ 
RewriteRule ^/(.*)  http://www.mysite.com/%1/$1  [R=301,L]',  
+0

Tôi chắc chắn muốn chuyển hướng nội bộ. toàn bộ mục đích của việc này là có thể sử dụng đường dẫn tuyệt đối trên các liên kết, css, img srcs, v.v. Có/sẽ là máy chủ ảo cho .my-site.com với bí danh cho *. .my-site.com, vì vậy, bất kỳ miền được yêu cầu nào của .my-site.com hoặc dưới đây sẽ được chọn bởi vhost –

0

Bạn đã thử sử dụng quy tắc ghi đè khác để xử lý quy tắc trước đó chưa?

RewriteEngine On 

RewriteCond %{HTTP_HOST}      ^([^.]+)\.bob\.my-domain\.com 
RewriteCond %{REQUEST_URI}      !^/%1.* 
RewriteRule ^(.*)$        /%1/$1 [C]  
RewriteRule ^/(.*)\.bob\.my-domain\.com/(.*) /$1/$2 [L] 

Nhưng tôi nghĩ rằng vấn đề lớn hơn của bạn là máy chủ của bạn không hiểu nó đang được phân phát dưới một tên khác.

Nó cho rằng nó đang chạy trong thư mục/gnome/trong khi những thứ mà trình duyệt đang chạy trong thư mục /. Vì vậy, bất kỳ URL tương đối nào mà bạn có sẽ gây ra sự cố.

Điều bạn cần là bộ lọc sẽ chạy tất cả URL trong trang của bạn thông qua bộ xử lý và thay đổi chúng từ/gnome/thành /.

+0

ý tưởng này là để khuyến khích các url tương đối, nhưng theo cấu trúc này, chúng cũng nên hoạt động. –

+0

Ngoài ra, tôi khá chắc chắn rằng các máy chủ HTTP không được sử dụng trong RewriteRule, chỉ cần URI –

Các vấn đề liên quan