2013-06-14 36 views
8

Tôi có sau trong tập tin .htaccess của tôi:RewriteRule tạo 500 máy chủ nội bộ Lỗi

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^directory/(.*)$ directory/index.php?id=$1 

Những gì tôi đang cố gắng để đạt được điều này là:

Khi URL www.mydomain.com/directory/10 được truy cập, trang www.mydomain.com/directory/?id=10 được hiển thị trên trình duyệt mà không thay đổi giao diện của URL.

Đoạn mã trên tạo ra lỗi máy chủ 500 nội bộ.

Có ai biết tôi đang đi đâu không?

+2

Lỗi 500 thường có nghĩa là lỗi đã được ghi ở đâu đó. Tìm nhật ký lỗi Apache và PHP của bạn và xem lỗi thực tế là gì. – IMSoP

+5

Lỗi 500 được gửi đến trình duyệt phải thông báo cho bạn biết rằng thông báo lỗi đầy đủ sẽ nằm trong nhật ký máy chủ. Đọc chúng. – Quentin

Trả lời

16

Mã của bạn được đảm bảo tạo 500 lỗi máy chủ nội bộ do lỗi gây ra vòng lặp vô hạn. Lý do là mẫu URI phù hợp của bạn là: ^directory/(.*)$

Kết hợp URL của bạn trước và sau khi viết lại. Và một khi nó đạt đến giới hạn tối đa cho phép viết lại nội bộ, Apache ném 500 lỗi máy chủ nội bộ và thoát ra ngoài.

Thay đổi mã của bạn như thế này:

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

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^directory/(.*)$ /directory/index.php?id=$1 [L,QSA,NC] 

Trên mã có thêm một RewriteCond %{REQUEST_FILENAME} !-f rằng sẽ đảm bảo để không cho phép thực hiện tiếp theo của RewriteRule sau khi lần đầu tiên kể từ khi /directory/index.php sẽ là một tập tin hợp lệ.

+1

Điều đó thật tuyệt vời! Cảm ơn bạn. – Tom

+0

Bạn được chào đón, vui mừng vì nó đã hoạt động. – anubhava

+1

Chỉ muốn thêm rằng tôi đã không nhận ra rằng quy tắc viết lại của tôi cũng đã tham chiếu chính nó. Thêm điều kiện ghi đè đã khắc phục sự cố. Một cái gì đó hiển nhiên nhưng dễ bỏ qua. –

1

Bạn nên cố gắng thêm một dấu gạch chéo vào phía trước:

RewriteRule ^/directory/(.*)$ directory/index.php?id=$1 

Tôi đã bắt gặp ra với điều đó trước.

Ngoài ra sử dụng RewriteLog và RewriteLogLevel để gỡ lỗi, và nhìn vào lỗi và tiếp cận Apache log để biết thêm:

RewriteLogLevel 3 
RewriteLog ${APACHE_LOG_DIR}/rewrite.log 

Đó sẽ để lại một log file trong thư mục apache log của bạn. Trong trường hợp của tôi là /var/log/apache

+0

Vâng đó là sắp xếp lỗi máy chủ, nhưng bây giờ tôi nhận được 'URL yêu cầu/thư mục/10 đã không được tìm thấy trên máy chủ này.' Bất kỳ ý tưởng? – Tom

+0

Vâng, bây giờ có vẻ như Rewrite không khớp. –

+0

Thêm một RewriteLog vào vhost của bạn (không hợp lệ trong .htaccess) để trỏ đến tệp nhật ký mà bạn muốn ghi vào. Tôi đã chỉnh sửa câu trả lời của mình bằng một ví dụ. –

9

Tôi gặp vấn đề tương tự và thấy rằng mô-đun "viết lại" chưa được bật trong trường hợp của tôi. Vì vậy, tôi cần phải kích hoạt nó và sau đó khởi động lại apache server:

  • Enable "viết lại" mô-đun: sudo a2enmod viết lại
  • Sau đó khởi động lại apache server: sudo dịch vụ apache2 restart

Hope điều này sẽ giúp bất cứ ai.

+0

Tuyệt vời ... đây là vấn đề đối với tôi .... –

0

Nếu bạn đang sử dụng CodeIgniter và đang gặp sự cố lỗi 500. Làm theo giải pháp.

Vì vậy, để xóa phân đoạn "index.php" của URL trong CodeIgniter, bạn cần thực hiện 2 điều.Đầu tiên là để chỉnh sửa file /system/application/config/config.php, thay đổi giá trị của chính sách index_page để trống:

$config['index_page'] = ''; 

Bước thứ hai là để tạo ra một tập tin .htaccess

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 [L] 

Và đó là nó! Từ bây giờ, các URL của trang web/hệ thống của bạn được tạo bằng CodeIgniter sẽ không còn có chuỗi (được gọi là "gây phiền nhiễu" bởi một số) "index.php".

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