Cách gỡ lỗi .htaccess RewriteRule không hoạt động


115

Tôi có một RewriteRuletrong một .htaccesstập tin mà không được làm bất cứ điều gì. Làm thế nào để tôi khắc phục sự cố này?

  • Làm thế nào tôi có thể xác minh nếu .htaccess tệp thậm chí đang được đọc và tuân theo bởi Apache? Tôi có thể viết một tin nhắn "nó đang hoạt động" không, nếu tôi viết nó, dòng đó sẽ được lặp lại ở đâu?
  • Nếu .htaccess tệp không được sử dụng, làm sao tôi có thể khiến Apache sử dụng nó?
  • Nếu .htaccessnó đang được sử dụng nhưng tôi RewriteRulevẫn không có tác dụng, tôi có thể làm gì để gỡ lỗi?

Câu trả lời:


143

Nhập một số giá trị rác vào .htaccess ví dụ của bạn foo bar, sakjnaskljdnas bất kỳ từ khóa nào không được htaccess nhận ra và truy cập URL của bạn. Nếu nó đang hoạt động, bạn sẽ nhận được một

500 lỗi máy chủ nội bộ

Lỗi máy chủ nội bộ

Máy chủ đã gặp lỗi nội bộ hoặc cấu hình sai và không thể hoàn thành yêu cầu của bạn ....

Tôi đề nghị bạn đặt nó ngay sau đó RewriteEngine on.


Vì bạn đang ở trên máy của bạn. Tôi đoán bạn có quyền truy cập vào .conftập tin apache .

mở .conftệp và tìm một dòng tương tự như:

LoadModule rewrite_module modules/mod_rewrite.so

Nếu nó được nhận xét (#), bỏ ghi chú và khởi động lại apache.


Để đăng nhập viết lại

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Đặt 3 dòng trên trong của bạn virtualhost. khởi động lại httpd.

RewriteLogLevel 9Sử dụng giá trị cao cho Cấp độ sẽ làm chậm đáng kể máy chủ Apache của bạn! Sử dụng logfile viết lại ở Cấp độ lớn hơn 2 chỉ để gỡ lỗi! Cấp 9 sẽ ghi lại hầu hết mọi chi tiết viết lại.


CẬP NHẬT

Mọi thứ đã thay đổi trong Apache 2.4:

TỪ Nâng cấp lên 2.4 từ 2.2

Các lệnh RewriteLogRewriteLogLevel đã bị xóa. Chức năng này hiện được cung cấp bằng cách định cấu hình mức ghi nhật ký thích hợp cho mô-đun mod_rewrite bằng cách sử dụng lệnh LogLevel . Xem thêm phần ghi nhật ký mod_rewrite.

Để biết thêm về LogLevel, hãy tham khảo Chỉ thị LogLevel

bạn có thể hoàn thành

RewriteLog "/path/to/rewrite.log"

theo cách này bây giờ

LogLevel debug rewrite_module:debug

Ok, vấn đề là, tôi đang cố gắng thêm một chữ viết lại vào tệp .htaccess và vì một số lý do, nó không sử dụng nó.
macha

@macha thử phương pháp trên. Nếu bạn gặp lỗi máy chủ nội bộ, điều đó có nghĩa là mod_rewrite (.htaccess) được bật. Bạn đang ở trên một máy chủ chia sẻ?
ThinkingMonkey

Không, tôi đang làm việc trên localhost của mình, bạn có biết khi nào tệp .htaccess tải không? Tôi mặc dù apache sẽ đọc cái này trước
macha

@macha .htaccess không bao giờ tải. Chúng được truy cập (nếu có) bởi apache khi bạn cố truy cập một trang có trong thư mục đó.
ThinkingMonkey

ok câu hỏi của tôi là, nếu ai đó yêu cầu một trang web, liệu apache có trực tiếp lấy các tập lệnh phía máy chủ hay nó sẽ tìm tập tin .htaccess trong thư mục đó và sau đó tiến hành ??
macha

52

Câu trả lời 'Nhập một số giá trị rác' không thực hiện được cho tôi, trang web của tôi vẫn tiếp tục tải mặc dù đã nhập rác.

Thay vào đó, tôi đã thêm dòng sau vào đầu tệp .htaccess:

deny from all

Điều này sẽ nhanh chóng cho bạn biết nếu .htaccess có được chọn hay không. Nếu .htaccess đang được sử dụng, các tệp trong thư mục đó sẽ không tải gì cả.


4
Đây là thử nghiệm đơn giản nhất nếu bạn không bận tâm điều gì trong vài giây trong khi bạn xác minh.
Sắp xếp

1
Đúng - mất khoảng một giây để xác minh rằng trang web tôi đang làm việc không sử dụng tệp .htaccess.
bonh

1
Cảm ơn, hoạt động như một bùa mê :) đã giúp tôi tiết kiệm thời gian!
Martijn van Hoof

32

Nói chung, bất kỳ thay đổi nào trong .htaccess sẽ có hiệu ứng rõ ràng. Nếu không có hiệu lực, hãy kiểm tra các tệp apache cấu hình của bạn, đại loại như:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Nên đổi thành

AllowOverride All

Và bạn sẽ có thể thay đổi chỉ thị trong các tệp .htaccess.


cảm ơn. Tôi tìm thấy phần có liên quan trong tệp apache2.conf chính cho cây thư mục / var / www
Tim Richardson

6

Có lẽ một phương pháp hợp lý hơn sẽ là tạo một tệp (ví dụ test.html), thêm một số nội dung và sau đó thử đặt nó làm trang chỉ mục:

DirectoryIndex test.html

Đối với hầu hết các phần, quy tắc .htaccess sẽ ghi đè cấu hình Apache, nơi làm việc ở cấp thư mục / tệp


4

Để trả lời câu hỏi đầu tiên của ba người được hỏi, một cách đơn giản để xem liệu tệp .htaccess có hoạt động hay không là kích hoạt một lỗi tùy chỉnh ở đầu tệp .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Đối với câu hỏi thứ hai của bạn, nếu tệp .htaccess không được đọc thì có thể cấu hình Apache chính của máy chủ có AllowOverride được đặt thành None. Tài liệu của Apache có các mẹo khắc phục sự cố cho điều đó và các trường hợp khác có thể ngăn .htaccess có hiệu lực.

Cuối cùng, để trả lời câu hỏi thứ ba của bạn, nếu bạn cần gỡ lỗi cụ thể biến mà bạn đang tham chiếu trong quy tắc viết lại của mình hoặc đang sử dụng một biểu thức mà bạn muốn đánh giá độc lập với quy tắc, bạn có thể thực hiện như sau:

Xuất ra biến bạn đang tham chiếu để đảm bảo nó có giá trị bạn đang mong đợi:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Kiểm tra biểu thức một cách độc lập bằng cách đặt nó trong <If>Chỉ thị. Điều này cho phép bạn đảm bảo biểu thức của bạn được viết đúng hoặc khớp khi bạn mong đợi nó:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Chúc mừng .htaccess gỡ lỗi!


3

Nếu bạn có quyền truy cập vào thư mục bin apache, bạn có thể sử dụng,

httpd -M để kiểm tra các mô-đun được tải trước.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Sau đó, các chỉ thị đơn giản như Options -Indexeshoặc deny from allsẽ củng cố rằng .htaccess đang hoạt động chính xác.


1

Để kiểm tra quy tắc viết lại htaccess của bạn, chỉ cần điền vào url bạn đang áp dụng quy tắc này, đặt nội dung của htaccess của bạn trên khu vực đầu vào lớn hơn và nhấn nút "Kiểm tra".

http://htaccess.mwl.be/


-1

Tại sao không đặt một số rác trong tệp .htaccess của bạn và cố gắng tải lại apache. Nếu apache không bắt đầu, bạn biết nó hoạt động. Xóa rác sau đó tải lại apache nếu nó tải chúc mừng bạn đã cấu hình .htaccess chính xác.


7
Tôi không nghĩ Apache sẽ không khởi động hoặc chạy nếu có .htaccess xấu, vì nó không kiểm tra .htaccess cho đến khi có yêu cầu trang.
Andrew
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.