2012-05-04 37 views
9

Đây là tập tin .htaccess của tôi:.htaccess - ngừng xử lý nếu viết lại đúng không?

Options +FollowSymlinks 
RewriteEngine on 

Rewritecond %{http_host} ^mysite.com [nc] 
Rewriterule ^(.*)$ http://www.mysite.com/$1 [r=301,nc] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . /404.php 

Khối RewriteCond/RewriteRule 1 là để chuyển hướng người dùng đến www nếu họ bước vào địa chỉ không có www.

Khối rewritecond/rewriterule thứ hai là chuyển hướng người dùng đến trang mà tôi đã tạo nếu họ nhập địa chỉ không tồn tại.

Mỗi quy tắc hoạt động trên riêng của mình:

Nếu tập tin .htaccess của tôi chỉ chứa khối đầu tiên, sau đó nó chuyển hướng thành công địa chỉ không www đến địa chỉ www.

Và nếu một địa chỉ không tồn tại được nhập, người dùng sẽ được chuyển hướng thành công đến trang 404.php của tôi.

Tuy nhiên, nếu tập tin .htaccess chứa cả khối, và một địa chỉ không www được nhập vào, sau đó thay vì một chuyển hướng thành công đến địa chỉ www, sau đây sẽ xảy ra:

(1) Sau đây là hiển thị trên trang:

Đã di chuyển vĩnh viễn

Tài liệu đã chuyển đến đây.

Ngoài ra, gặp phải lỗi Lỗi máy chủ nội bộ 500 trong khi cố gắng sử dụng ErrorDocument để xử lý yêu cầu.

Apache/1.3.41 Server tại mysite.com Cảng 80

(2) Các mục sau đây được tạo ra trong các bản ghi lỗi:

[Fri 04 tháng năm 01:54:19 2012] [lỗi ] [khách hàng 109.109.109.109] mod_rewrite: số lượng chuyển hướng nội bộ tối đa đã đạt được. Giả sử lỗi cấu hình. Sử dụng 'RewriteOptions MaxRedirects' để tăng giới hạn nếu cần thiết.

Tôi cho rằng điều xảy ra là vòng lặp vô hạn bằng cách nào đó đang được tạo.

Tôi tự hỏi liệu có nên cho tệp .htaccess ngừng xử lý lệnh nếu điều kiện đầu tiên đã được đáp ứng hay không sẽ giải quyết được sự cố. Vì vậy, không ai biết làm thế nào để làm điều này?

(Side lưu ý. Nói chung, tôi tìm thấy những tài liệu hiện có trên .htaccess để được hoàn toàn khủng khiếp. Tôi tự hỏi, nếu bất cứ ai khác cảm thấy tương tự.)

Cảm ơn trước.

Trả lời

10
+1

Tôi nghe theo lời khuyên của bạn, do sự thay đổi duy nhất tập tin của tôi là viết lại đầu tiên quy tắc có những điều sau đây: 'Rewriterule^(. *) $ http://www.mysite.com/$1 [r = 301, nc, L]' Và mọi thứ có vẻ hoạt động chính xác ngay bây giờ. Cảm ơn bạn. – oyvey

+0

Không cần phải lặp lại trang web. Và: Apache RewriteRules được tham lam theo mặc định. ☞ 'RewriteRule (. *) $ 1 [R = 404, L]' –

3

Bạn có thể thử mã này thay vì:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

ErrorDocument 404 404.php 

Rewritecond %{HTTP_HOST} ^mysite\.com$ [NC] 
Rewriterule^http://www.mysite.com%{REQUEST_URI} [R=302,NC,L] 

Khi bạn xác minh rằng nó làm việc tốt sau đó bạn thay đổi R=302-R=301.

+0

Cảm ơn. Tôi thực sự ban đầu xử lý chuyển hướng cho địa chỉ xấu thông qua ErrorDocument, nhưng nếu tôi nhớ chính xác, nó không hoạt động cho các địa chỉ kết thúc bằng php, và đó là lý do tôi chuyển sang mã hiện tại. – oyvey

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