2008-10-18 12 views
7

Tôi đã có một ứng dụng web tomcat 6 chạy với httpd apache làm giao diện người dùng. Tôi đang sử dụng mod_proxy và mod_proxy_ajp để chuyển tiếp các yêu cầu đến tomcat. Máy chủ của tôi đang chạy ubuntu. Bây giờ tôi đang cố gắng sử dụng mod_rewrite để xóa www hàng đầu, để url trang web chuẩn của tôi là http://domain.com thay vì http://www.domain.comLàm cách nào để khắc phục sự cố tại sao quy tắc viết lại của tôi không được apache áp dụng?

Tôi đã đọc một số hướng dẫn về cách sử dụng mod_rewrite, nhưng tôi không thể viết lại bất kỳ công việc. Tôi đã thử đặt quy tắc viết lại trong một tập tin .htaccess (sau khi sửa đổi/etc/apache/sites-available/tập tin mặc định của tôi để thiết lập AllowOverride tất cả). Tôi đã thử đặt quy tắc viết lại trong apache2.conf, httpd.conf và rewrite.conf. Tôi đã thử tất cả những điều này với ghi nhật ký ghi lại được bật. Tệp nhật ký được tạo, nhưng apache đã không viết gì cho nó. Tôi nghĩ rằng có lẽ mod_proxy bằng cách nào đó ngăn chặn các quy tắc viết lại đang được sử dụng, vì vậy tôi đã cố gắng vô hiệu hóa điều đó ... và tôi vẫn không được viết lại, và không có gì để đăng nhập.

Tại thời điểm này, tôi hoàn toàn không biết phải cố gắng làm gì tiếp theo. Làm thế nào để tôi đi về xử lý sự cố tại sao apache không sử dụng quy tắc viết lại của tôi?

Để tham khảo, đây là chỉ thị viết lại tôi:

<IfModule mod_rewrite.c> 

    RewriteEngine on 
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC] 
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L] 
    RewriteLog "/var/log/apache2/rewrite.log" 
    RewriteLogLevel 3 

</IfModule> 

Sửa: các câu trả lời dưới đây là hữu ích cho trường hợp cụ thể của tôi, nhưng có lẽ không phải là hữu ích cho cộng đồng-at-lớn như câu trả lời về cách bạn gỡ rối các chỉ thị apache nói chung. Ví dụ, có cách nào để cho phép đăng nhập vào điểm mà nó sẽ cho tôi biết chỉ thị nào đang được áp dụng theo thứ tự như yêu cầu đến không?

Chỉnh sửa 2: Tôi đã có những thứ để làm việc ngay bây giờ. Máy chủ ảo của tôi không được thiết lập đúng, và tôi cũng không hoàn toàn có quyền viết lại regex. Dưới đây là các chỉ thị viết lại cuối cùng tôi đã đi làm:

<IfModule mod_rewrite.c> 
     RewriteEngine On 
     RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC] 
     RewriteRule ^(.*)$ http://domain.com$1 [L,R=301] 
</IfModule> 
+0

Bạn đã chắc chắn rằng mod_rewrite được tải? –

+0

Có. Tôi tải nó bằng cách sử dụng "a2enmod rewrite", thiết lập một liên kết tượng trưng trong mods-enabled để trỏ tới mod \ _rewrite.load trong mod-available. Tôi cũng đã cố gắng cố tình viết sai chính tả một trong các quy tắc viết lại (tức là "Rewrite3Rule") để kiểm tra rằng các quy tắc đang thực sự được apache chọn, và apache cho tôi một thông báo lỗi như tôi mong đợi. Khi tôi sửa chữa chính tả và khởi động lại apache nó khởi động lại tốt. –

Trả lời

4

Đang cố gắng để trả lời câu hỏi của bạn: Để gỡ lỗi Apache hoạt động bạn có thể điều chỉnh LogLevel đến một mức độ thấp hơn (có thể debug). Nhưng ngay cả khi bạn đặt debug nếu bạn tắt Nhật ký cho mô-đun được đề cập, bạn sẽ không nhận được bất kỳ tin nhắn nào từ đó. Ví dụ: mặc định [RequestLogLevel][2] là 0, ví dụ: mô-đun không viết bất kỳ thư nào.Tôi thấy bạn đã giải quyết nó thành 3 nhưng giống như RoBorg đã thay đổi thành 9 có thể quá thấp đối với trường hợp của bạn.

Cố gắng khắc phục sự cố: Cố gắng thay đổi cách bạn viết lại tên máy chủ bằng biểu mẫu nghịch đảo - xem tên máy chủ có phải là thứ bạn muốn không và thay đổi tên máy chủ bạn muốn. Như đã trình bày trong URL Rewriting Guide - Apache HTTP Server tại trang web Apache:

Canonical Hostname

Mô tả: Mục đích của quy định này là để buộc việc sử dụng một hostname Đặc biệt, trong ưu tiên cho hostname khác có thể sử dụng để truy cập cùng một trang web. Ví dụ: Ví dụ: nếu bạn muốn bắt buộc sử dụng www.sử dụng www.example.com thay vì example.com, bạn có thể sử dụng biến thể của công thức sau. Giải pháp:

# To force the use of 
RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC] 
RewriteCond %{HTTP_HOST} !^$ 
RewriteRule ^/(.*)   http://www.example.com/$1 [L,R] 

Trong ví dụ của mình, họ thay đổi example.com-www.example.com nhưng bạn có ý tưởng. Chỉ cần điều chỉnh nó cho trường hợp của bạn.

+0

Thoát ký tự dấu chấm sẽ không tạo sự khác biệt trong trường hợp này –

+1

Dấu chấm sẽ vẫn khớp với một dấu chấm ngay cả khi dấu chấm thoát sẽ chỉ khớp với dấu chấm thực tế một dấu chấm không thoát sẽ khớp với bất kỳ thứ gì kể cả dấu chấm mà dấu chấm được cho là khớp. –

+0

Bạn vừa đúng. Lỗi của tôi. Đã cập nhật câu trả lời. –

0

Hãy thử tăng mức ghi nhật ký lên đến 9 (mức tối đa).
Hãy chắc chắn rằng apache có quyền thích hợp đối với tệp nhật ký (mặc dù nếu nó tạo ra nó, có vẻ như nó có khả năng nó cũng có thể ghi vào nó).
Thử viết lại quy tắc khác nhau, không có điều kiện, ví dụ RewriteRule .* www.google.com [RL]

+0

Đề xuất tốt, nhưng tôi vẫn không nhìn thấy hoặc là viết lại làm việc hoặc bất cứ điều gì trong nhật ký. –

1

RewriteEngine on 
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC] 
    RewriteRule ^(.*)$ "http\:\/\/domain\.com\/$1" [R=301,L] 

</IfModule> 

Đã cùng một vấn đề với máy chủ của tôi, nhưng điều này đã làm việc

0

Trong đó bối cảnh được những quy tắc đặt ở đâu? Ví dụ, bạn có thể đặt chúng dưới một máy chủ ảo khác. Hãy thử đặt chúng bên ngoài bất kỳ vùng chứa nào nếu bạn chỉ có một miền để kiểm tra.

Trong mọi trường hợp, có cách khác để đạt được 'không có www', bao gồm việc sử dụng hai máy chủ ảo, một cho www và một cho 'no-www'. www một chuyển hướng đến một trong những khác:

<VirtualHost *:80> 
    ServerName www.domain.com 
    Redirect permanent/http://domain.com 
</VirtualHost> 


<VirtualHost *:80> 
    ServerName domain.com 
    #The rest of the configuration (proxying, etc.) 
</VirtualHost> 
+0

Tôi đã thử đặt chúng trong tập tin /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (được liên kết với symlinked từ/etc/apache2/mods) -enabled). Sự hiểu biết của tôi là các quy tắc này sẽ luôn áp dụng. Tôi chỉ chạy một tên miền/máy chủ ảo tại đây. –

+0

Tôi đã thử đề xuất của bạn và apache phàn nàn về phần cổng 80 (*: 80): [lỗi] VirtualHost *: 80 - trộn * cổng và không * cổng với địa chỉ NameVirtualHost không được hỗ trợ, tiếp tục với kết quả không xác định . Tôi lấy số cổng, và nó khởi động lại tốt, nhưng không chuyển hướng. –

+1

Đây là một trường hợp thích hợp hơn cho IRC hơn cho Stack Overflow. Có nhiều cấu hình để gỡ lỗi. Hãy thử #apache trên irc.freenode.net nếu không có đề xuất nào ở đây hoạt động. –