URL được viết lại với độ dài tham số> 255 không hoạt động


12

Tôi đang sử dụng mod_rewrite để viết lại các URL như thế này:

http://example.com/1,2,3,4/foo/

Bằng cách làm điều này trong .htaccess:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

Nó hoạt động tốt, ngoại trừ khi "1,2,3,4" biến thành một chuỗi dài hơn 255 ký tự, Apache trả về "403 Bị cấm".

Không có vấn đề truy cập foo.php?id=1,2,3,4trực tiếp, ngay cả với một chuỗi id rất dài, tuy nhiên đây không phải là một lựa chọn cho tôi.

Có một số cài đặt Apache hoặc khác tôi nên điều chỉnh?

CẬP NHẬT : Tôi đã bật RewriteLog bằng RewriteLogLevel 9. Với một chuỗi id ngắn, tôi nhận được một vài dòng trong tệp nhật ký của mình. Nhưng khi chuỗi id lớn hơn 255 ký tự., Không có gì được ghi lại (có vẻ như mod_rewrite thậm chí không thực thi?).

Nếu bạn thấy câu hỏi này thú vị / hữu ích, vui lòng upvote nó.


Đây có thể là một vấn đề regex? Bạn đã kiểm tra xem yêu cầu viết lại có đúng với các chuỗi dài hơn 255 ký tự không? Nếu không, có lẽ bạn có thể đăng các yêu cầu trước và sau khi viết lại.
tomjedrz

3
Cho phép ghi nhật ký của mod_rewrite RewriteLogRewriteLogLevelvì vậy bạn có thể thấy những gì đang được khớp và cách thực sự được viết lại. Tôi đoán rằng chỉ có 255 ký tự được sao chép vào $1và cuối cùng là một idứng dụng khách không được phép xem, vì vậy Apache trả về 403. Tôi đã không xem mã, nhưng có thể là do Apache thao túng độ phản hồi trong bộ đệm 256 byte cố định (thứ 256 được dành riêng cho NULL kết thúc).
James Sneeringer

Xem cập nhật trong câu hỏi - không có gì được ghi lại cho các thông số dài
philfreo

Câu trả lời:


8

Bạn có nghĩ rằng bạn đang chạy vào một giới hạn của hệ thống tập tin?

Có thể độ dài tên tệp tối đa là 255 byte và khi quy tắc apache hoặc mod_rewrite kiểm tra xem tệp có tồn tại lỗi không được hệ điều hành trả về apache.

Nếu bạn đặt một số quy tắc trong tệp .htaccess của mình, thì đã quá muộn để khắc phục sự cố. Apache sẽ cố gắng thống kê tên tệp và ném lỗi hệ thống tệp '(36) Tên tệp quá dài', trả về lỗi 403.

Có lẽ bạn có thể thay đổi mẫu URL bên trong ứng dụng của mình. đến tối đa 255 ký tự từ dấu gạch chéo đến dấu gạch chéo.

EDIT: xem ở đây để có câu trả lời chi tiết cho vấn đề này. Tôi mượn của tôi từ đó.


Vâng, đây hiện là tất cả những gì chúng ta có thể làm, tôi hy vọng sẽ có một cách giải quyết hoặc cài đặt chỉnh sửa.
philfreo

3
Microspino, Có vẻ như bạn đã cắt và dán một phần câu trả lời của mình từ câu trả lời của @Jeff Clark tại đây: serverfault.com/questions/120394/ Lỗi . Bạn nên siêu liên kết đến câu trả lời đó, để anh ta có được một chút tiếng tăm.
Stefan Lasiewski

@Stefan lasieswski: bạn nói đúng, tôi đã thêm một tài liệu tham khảo.
microspino

vì vậy, bạn đang nghĩ có lẽ Apache đang cố gắng thống kê tệp được yêu cầu - ý tôi là, đó có thể là cách duy nhất để giải thích rằng URL quá dài thậm chí không được chọn bởi công cụ viết lại ...
HorusKol

Vâng, đây là ý tưởng của tôi, mặc dù tôi nghĩ rằng nói chung nên có các url và tên tệp quá dài nên tránh vì một số lý do. Vì vậy, lời khuyên tốt nhất tôi có thể nghĩ có lẽ là thay đổi thứ gì đó trong mẫu URL nếu tên tệp chưa quá dài.
microspino

2

Có một câu hỏi tương tự về giới hạn này ở đây :

Bạn có thể đang chạy vào một giới hạn của hệ thống tập tin cơ bản

Tôi không biết nếu bạn đang sử dụng REQUEST_FILENAME ở đâu đó trong cấu hình .htaccess của bạn, vì vậy không biết liệu giải pháp được cung cấp có hoạt động hay không.


Điều đó có ý nghĩa, nhưng không, tôi thì không. Tôi đã chỉnh sửa câu hỏi của mình để bao gồm toàn bộ tệp .htaccess. Những ý tưởng khác?
philfreo

Theo "Chi tiết kỹ thuật của Apache mod_rewrite" tại httpd.apache.org/docs/trunk/rewrite/tech.html "Mặc dù mod_rewrite viết lại URL thành URL, URL để tên tệp và thậm chí tên tệp thành tên tệp, API hiện chỉ cung cấp URL -filename hook. ". Vì vậy, ngay cả khi bạn không nhấn một tệp thực tế, có thể URL móc tên tệp đang chạm giới hạn tài nguyên hệ điều hành?
Stefan Lasiewski

0

Chắc chắn là một câu hỏi thú vị. Bạn có chạy mod_security không và nếu có, đã thử mà không có nó? Có lẽ đơn giản là nó không thích tên đường dẫn dài hoặc tên đường dẫn dài có dấu phẩy chưa được mã hóa trong đó? ^^

Mặc dù theo bản năng, nó cảm thấy giống như một giới hạn trên đường dẫn url hoặc ít nhất là các phân đoạn riêng lẻ của nó hoặc giải thích hệ thống tập tin cơ bản của nó như GmonC đã viết. Điều đó cũng sẽ giải thích tại sao url thông thường với phần dài trong chuỗi truy vấn hoạt động tốt.

Tôi nghĩ rằng ASP.NET cũ hơn thường có giới hạn đường dẫn yêu cầu ~ 260 ký tự hoặc một cái gì đó là tốt.


Xem cập nhật cho câu hỏi. Và không, tôi không thấy tệp mod_security trong /usr/include/apache2/hoặc /usr/lib/apache2/modules/(nhưng tôi thấy mod_rewrite ở đó) vì vậy tôi cho rằng nó chưa được cài đặt.
philfreo

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.