2008-09-08 49 views
6

Tôi đang sử dụng Helicon's ISAPI Rewrite 3, về cơ bản cho phép .htaccess trong IIS. Tôi cần chuyển hướng URL không phải www đến phiên bản www, ví dụ: example.com nên chuyển hướng đến www.example.com. Tôi đã sử dụng các nguyên tắc sau từ các ví dụ nhưng nó ảnh hưởng đến các tên miền phụ:Chuyển hướng URL không www đến www bằng cách sử dụng .htaccess

RewriteCond %{HTTPS} (on)? 
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC] 
RewriteCond %{REQUEST_URI} (.+) 
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L] 

này hoạt động cho hầu hết các phần, nhưng cũng được chuyển hướng sub.example.com để www.sub.example.com. Làm thế nào tôi có thể viết lại quy tắc trên để các tên miền phụ không được chuyển hướng?

Trả lời

3

Nối RewriteCond sau:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC] 

Bằng cách đó nó sẽ chỉ áp dụng các quy tắc để nondottedsomething.uptofiveletters như bạn có thể thấy, subdomain.domain.com sẽ không phù hợp với điều kiện và do đó sẽ không được viết lại.

Bạn có thể thay đổi [a-z] {2,5} cho một regex phù hợp chặt chẽ hơn, cũng như đặt tất cả các ràng buộc cho ký tự được phép trong tên miền (như [^.] + Dễ dãi hơn mức cần thiết).

Tất cả trong tất cả những gì tôi nghĩ trong trường hợp này không cần thiết.

EDIT: Sadie phát hiện một lỗ hổng trên regex, thay đổi phần đầu tiên của nó từ [^.] Để [^.] +

+0

bạn có nói rằng tôi nên thay thế dòng 2 bằng điều kiện của bạn hay thêm điều kiện của bạn trên một dòng mới? Việc thêm nó trên một dòng mới có ảnh hưởng đến RewriteRule bằng cách sử dụng% 1,% 2 và% 3 không? – chrisofspades

0

Bạn không thể điều chỉnh RewriteCond để chỉ hoạt động trên example.com?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC] 
+0

thay vào đó phải là^example \ .com $. Trong mọi trường hợp, tôi theo ấn tượng rằng chris muốn một giải pháp chung chung, không phải là một cho một tên miền duy nhất. –

1

tôi đã nhận được thêm quyền kiểm soát sử dụng urlrewriter.net, một cái gì đó như:

<unless header="Host" match="^www\."> 
    <if url="^(https?://)[^/]*(.*)$"> 
    <redirect to="$1www.domain.tld$2"/> 
    </if> 
    <redirect url="^(.*)$" to="http://www.domain.tld$1"/> 
</unless> 
0

Tại sao bạn không có thứ gì đó như thế này trong tệp vhost (của httpd)?

ServerName: www.example.com 
ServerAlias: example.com 

Tất nhiên đó sẽ không tái trực tiếp, mà sẽ chỉ tiếp tục như bình thường

1

Zigdon có ý tưởng đúng trừ regex của ông là không hoàn toàn đúng. Sử dụng

^example\.com$

thay vì đề nghị của ông:

^example\.com(.*)

Nếu không, bạn sẽ không chỉ được phù hợp với example.com, bạn sẽ được phù hợp với những thứ như example.comcast.net, example.com.au vv

1

@ Vinko

Đối với cách tiếp cận chung của bạn, tôi không chắc chắn wh bạn đã chọn giới hạn độ dài của TLD trong regex của bạn? Nó không phải là rất tương lai-bằng chứng, và tôi không chắc chắn những gì nó mang lại lợi ích? Nó thực sự thậm chí không "chứng minh bây giờ" bởi vì có ít nhất một TLD 6 ký tự trên đó (.museum) mà sẽ không được xuất hiện.

Có vẻ như không cần thiết để tôi làm điều này. Bạn không thể chỉ làm ^[^.]+\.[^.]\+$? (lưu ý: dấu chấm hỏi là một phần của câu, không phải là regex!)

Tất cả những điều đó sang một bên, có một vấn đề lớn hơn với cách tiếp cận này là: nó sẽ thất bại đối với các miền không trực tiếp bên dưới TLD. Đây là các miền ở Úc, Vương quốc Anh, Nhật Bản và nhiều quốc gia khác, những người có phân cấp: .co.jp, .co.uk, .com.au, v.v.

Có hay không có bất kỳ mối quan tâm nào đối với OP, tôi không biết nhưng đó là điều cần lưu ý nếu bạn sau khi trả lời "khắc phục tất cả".

OP chưa nêu rõ liệu anh ấy muốn một giải pháp chung hay giải pháp cho một nhóm (hoặc nhóm nhỏ) tên miền đã biết. Nếu đó là thứ hai, hãy xem lưu ý khác của tôi về cách sử dụng cách tiếp cận của Zigdon. Nếu nó là cũ, sau đó tiến hành tiếp cận của Vinko có tính đến các thông tin trong bài viết này.

Chỉnh sửa: Một điều tôi đã bỏ ra cho đến bây giờ, có thể hoặc không thể là một lựa chọn cho bạn kinh doanh khôn ngoan, là đi theo cách khác. Tất cả các trang web của chúng tôi chuyển hướng http://www.domain.com đến http://domain.com. Các folks tại http://no-www.org làm cho một trường hợp khá tốt (IMHO) cho điều này là "đúng" cách để làm điều đó, nhưng nó vẫn chắc chắn chỉ là một vấn đề ưu tiên. Tuy nhiên, có một điều chắc chắn là viết một quy tắc chung cho loại chuyển hướng đó dễ dàng hơn nhiều so với quy tắc này.

1

@org 0100h Có, có nhiều biến nằm ngoài mô tả vấn đề và tất cả các điểm của bạn là điểm hợp lệ và cần được giải quyết trong trường hợp triển khai thực tế. Có cả ưu và khuyết điểm đối với regex được đề xuất của bạn. Một mặt nó dễ dàng hơn và bằng chứng trong tương lai, mặt khác, bạn có thực sự muốn khớp với example.foobar nếu được gửi trong tiêu đề Máy chủ không? Có thể có một số trường hợp cạnh khi bạn sẽ chuyển hướng đến miền sai. Một lựa chọn thrid được sửa đổi regex để sử dụng một danh sách các lĩnh vực thực tế, nếu có nhiều hơn một, như

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC] 

(Lưu ý để chris, rằng một sẽ thay đổi% 1)

@chrisofspades Đó là không có nghĩa là để thay thế nó, điều kiện số hai của bạn đảm bảo rằng nó không có www, trong khi tôi thì không. Nó sẽ không thay đổi giá trị của% 1,% 2,% 3 vì nó không lưu các kết quả phù hợp (iow, nó không sử dụng dấu ngoặc đơn).

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