Cách gỡ lỗi Apache mod_rewrite


171

Tôi có hai vấn đề chính với mod_rewrite:

1) Không có lỗi có ý nghĩa được báo cáo khi tôi có quy tắc không hợp lệ

nhập mô tả hình ảnh ở đây

2) Để kiểm tra đáng tin cậy từng sửa đổi, tôi phải xóa bộ nhớ cache của chrome. Đây không phải là khoa học tên lửa, nhưng tôi phải nhấn Ctrl + Shift + Delete sau đó nhấp OK, sau đó đóng cửa sổ và tải lại.

Tôi muốn xem liệu có bất kỳ chuyên gia nào sẵn sàng chia sẻ bí mật của họ để quản lý hiệu quả mã mod_rewrite không.


1
Puk, xem stackoverflow.com/questions/9153262/ , nơi tôi thảo luận về một số thủ thuật stanbdard.
TerryE

Câu trả lời:


283

Một mẹo nhỏ là bật nhật ký viết lại. Để bật nó lên, hãy thử các dòng này trong cấu hình chính apache hoặc tệp máy chủ ảo hiện tại ( không phải trong .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Vì các lệnh của Apache httpd 2.4 mod_rewrite RewriteLog và RewriteLogLevel đã được thay thế hoàn toàn bằng cấu hình ghi nhật ký trên mỗi mô-đun mới.

LogLevel alert rewrite:trace6

81
Bạn không thể đặt cái này trong .htaccess. Bạn phải đặt nó trong cấu hình Virtualhost.
Attila Szeremi

7
Bạn cũng phải có RewriteEngine Onphần đó vì nếu bạn chỉ kích hoạt nó (như tôi đã làm) trong .htaccesstệp, thì sẽ không có gì được ghi lại.
chacham15

12
Tệp nhật ký nằm ở đâu trong apache 2.4?
Charles John Thompson III

4
Bạn sẽ tìm thấy các mục nhật ký 2.4 trong nhật ký lỗi liên quan. Điều này có thể phụ thuộc vào cấu hình của bạn, nhưng các thiết lập Debian / Ubuntu mặc định có chúng trong /var/log/apache2/error.log
Josiah

10
Mẹo chuyên nghiệp: Hãy nhớ tắt đăng nhập viết lại của bạn. Nếu bạn quên, bạn sẽ lấp đầy đĩa cứng của mình khá nhanh chóng, đặc biệt là trên máy chủ sản xuất.
John Hunt

132

Lệnh LogRewrite như Ben đã đề cập không còn có sẵn trong Apache 2.4. Bạn cần sử dụng chỉ thị LogLevel thay thế. Ví dụ

LogLevel alert rewrite:trace6

Xem http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging


22
tập tin nhật ký liên quan đến cái này ở đâu?
Charles John Thompson III

8
@CharlesJohnThndryIII - Logfile là nhật ký lỗi (được chỉ định bởi chỉ thị ErrorLog). Mỗi tài liệu, bạn chỉ có thể nhận được các tin nhắn viết lại bằng grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
đừng quên khởi động lại apache
Kế toán م

1
Tôi phải đảm bảo AllowOverrideđược đặt thành All!
Michael

25

Đối với độ phân giải URL cơ bản, hãy sử dụng trình tải xuống dòng lệnh như wgethoặc curlđể thực hiện kiểm tra, thay vì trình duyệt thủ công. Sau đó, bạn không phải xóa bất kỳ bộ đệm; chỉ cần mũi tên lên và nhập vào một vỏ để chạy lại tìm nạp thử nghiệm của bạn.


14
Một mẹo khác là sử dụng Chrome "Chế độ khiêu dâm" (Ctl + Shift + N). Khi bạn đóng cửa sổ, bất kỳ bối cảnh phiên được lưu trong bộ nhớ cache đều bị chuyển.
TerryE

Tôi nghĩ rằng trình duyệt "phiên riêng tư" của Firefox cũng vậy. Nhưng bạn có nói bối cảnh này là trên mỗi cửa sổ riêng lẻ (vì vậy bạn sẽ không đóng Chrome?)
Kaz

2
AFAIK, Chrome và Ff khác nhau ở chỗ Ff chạy dưới dạng một quy trình duy nhất ở chế độ riêng tư hoặc không. Với Chrome, mỗi tab hoặc cửa sổ chạy dưới dạng một quy trình riêng biệt và có thể riêng lẻ ở chế độ riêng tư; đóng một cửa sổ / tab riêng và bối cảnh của nó bị hỏng.
TerryE

1
Addon PrivateTab cho FF thực hiện điều đó. Mỗi tab hoạt động riêng lẻ.
Javid

Phương pháp này cũng cho thấy chuyển hướng! Rất vui cho ai đó không có quyền truy cập vào tệp cấu hình apache máy.
Geof Sawaya

14

người kiểm tra htaccess .

Nó cho thấy những điều kiện nào đã được kiểm tra cho một URL nhất định, những điều kiện nào đáp ứng các tiêu chí và quy tắc nào đã được thực thi.

Nó dường như có một số trục trặc, mặc dù.


2
Đối với tôi, nó hiển thị một quy tắc thực thi màu xanh lá cây trong dòng cuối cùng mà không có bất kỳ mã nào.
Andy

@thombr bạn có thể chính xác hơn được không? Các liên kết không hoạt động? Hay công cụ? Chính xác thì cái gì không hoạt động? Và tại sao điều đó có liên quan trong bối cảnh của câu hỏi này?
Andy

1
Điều này cho tôi biết rằng URL đang được chuyển đổi như mong đợi ... tuy nhiên trên máy chủ thực tế tôi đang nhận được 404
Michael

@michael là quy tắc được thử nghiệm duy nhất có trong cấu hình của bạn? Là mod_rewrite thực sự được cài đặt và hoạt động?
Andy

Hóa ra phần ghi đè không được kích hoạt
Michael

3

Dựa trên câu trả lời của Ben, bạn có thể làm như sau khi chạy apache trên Linux (Debian trong trường hợp của tôi).

Đầu tiên tạo tập tin viết lại-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Sau đó nhập

$ a2enmod viết lại-log

theo dõi bởi

$ dịch vụ apache2 khởi động lại

Và khi bạn hoàn thành với việc gỡ lỗi các quy tắc viết lại của bạn

$ a2dismod viết lại-log && dịch vụ apache2 khởi động lại


Điều này đã không làm việc. Tôi nhận được sandino @ ghen tị: ~ $ sudo dịch vụ apache2 khởi động lại * Khởi động lại máy chủ web apache2 [fail] * Apache2 configtest không thành công. Đầu ra của kiểm tra cấu hình là: AH00526: Lỗi cú pháp trên dòng 1 của /etc/apache2/mods-enables/rewrite-log.load: Lệnh không hợp lệ 'RewriteLog', có thể bị sai chính tả hoặc được xác định bởi một mô-đun không có trong cấu hình máy chủ
sandino

3
@sandino, bạn đang chạy phiên bản apache nào? Có vẻ như cú pháp này đã được thay đổi cho 2.4, thay vào đó hãy sử dụng: LogLevel warn rewrite:trace8hoặc LogLevel info rewrite:trace8trong đó 8 có thể là bất kỳ số nào từ 1-8
insaner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.