2010-07-13 13 views
64

Giới thiệu về hệ thốngurlencoded Forward dấu gạch chéo được phá vỡ URL

Tôi có URL của định dạng này trong dự án của tôi: -

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0 

đâu cặp từ khóa/lớp có nghĩa là tìm kiếm với từ khóa "lớp".

Tôi có một tệp index.php chung thực thi cho mọi mô-đun trong dự án. chỉ có một quy tắc viết lại để loại bỏ các index.php từ URL: -

RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php [L,QSA] 

Tôi đang sử dụng urlencode() trong khi chuẩn bị các URL tìm kiếm và urldecode() trong khi đọc các URL tìm kiếm.

Vấn đề

URL Chỉ có nhân vật dấu gạch chéo là vi phạm gây ra trang 404 không tìm thấy lỗi. Ví dụ, nếu tôi tìm kiếm one/two URL là

http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/ 

Làm thế nào để sửa lỗi này? Tôi cần phải giữ index.php ẩn trong URL. Ngược lại, nếu đó là không cần thiết, có sẽ không có vấn đề với dấu gạch chéo và tôi có thể đã sử dụng URL này: -

http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one 
%2Ftwo/new_search/1/search_exam/0/search_subject/0 
+1

tôi cảm thấy nó là tốt nhất để có Các URL như thế này: - 'http: // project_name/browse_by_exam? Type/tutor_search/keyword/class% 2Fnew/new_search/1/search_exam/0/search_subject/0' Bằng cách đó tôi thoát khỏi những khó khăn y của khả năng đọc gây ra bởi & param1 = value1 & param2 = value2 ước và tôi cũng có thể cho phép chuyển tiếp slashes (bây giờ trong phần chuỗi truy vấn bằng cách sử dụng '?') Tôi sẽ tránh AllowEncodedSlashes vì ​​Bobince nói 'Ngoài ra một số công cụ hoặc nhện có thể nhận được bối rối bởi nó. Mặc dù% 2F có nghĩa là/trong một phần đường dẫn là chính xác theo tiêu chuẩn, hầu hết các trang web tránh nó.' url .htaccess url-routing –

+1

bạn có thể sử dụng% 2F nếu sử dụng theo cách này? Param1 = value1 & param2 = value% 2Fvalue nhưng nếu bạn sử dụng/param1 = value1/param2 = value% 2Fvalue nó sẽ ném một lỗi. – Ahmad

+0

Liên quan: [Là dấu gạch chéo ("/") tương đương với dấu gạch chéo được mã hóa ("% 2F") trong phần đường dẫn của URL HTTP] (http://stackoverflow.com/q/1957115/95735) –

Trả lời

129

Apache phủ nhận tất cả các URL với %2F ở phần đường, vì lý do an ninh: các kịch bản có thể 't bình thường (nghĩa là không viết lại) cho biết sự khác biệt giữa %2F/ do biến môi trường PATH_INFO được tự động giải mã URL (đó là ngu ngốc, nhưng một phần lâu dài của đặc tả CGI để không có gì có thể được thực hiện về nó).

Bạn có thể tắt tính năng này bằng chỉ thị AllowEncodedSlashes, nhưng lưu ý rằng các máy chủ web khác vẫn không cho phép (không có tùy chọn tắt tính năng này) và các ký tự khác cũng có thể là điều cấm kỵ (ví dụ: %5C) và rằng %00 nói riêng sẽ luôn bị chặn bởi cả Apache và IIS. Vì vậy, nếu ứng dụng của bạn dựa vào việc có thể có %2F hoặc các ký tự khác trong phần đường dẫn, bạn sẽ giới hạn các tùy chọn khả năng tương thích/triển khai của mình.

Tôi đang sử dụng urlencode() trong khi chuẩn bị các URL tìm kiếm

Bạn nên sử dụng rawurlencode(), không urlencode() cho thoát phần con đường. urlencode() bị đặt tên sai, nó thực sự là dành cho dữ liệu application/x-www-form-urlencoded chẳng hạn như trong chuỗi truy vấn hoặc phần thân của yêu cầu POST chứ không phải cho các phần khác của URL.

Sự khác biệt là + không có nghĩa là khoảng trống trong phần đường dẫn. rawurlencode() sẽ tạo ra một cách chính xác %20 thay thế, sẽ hoạt động cả trong dữ liệu được mã hóa dạng biểu mẫu và các phần khác của URL.

+4

Ah, vì vậy đó là lý do tại sao dấu gạch chéo bị từ chối. Chẩn đoán và điều trị hoàn hảo. –

+1

+1 Tôi đã cố gắng giải thích một số điều này trong một trong những câu hỏi khác của anh ấy, nhưng anh đã làm điều đó một cách mạch lạc hơn tôi có thể. –

+3

Xin chào Bobince, 'rawurlencode()' cũng chuyển đổi các dấu gạch chéo về phía trước thành '% 2F' vẫn đang phá vỡ URL của tôi. Tôi không hiểu thực sự làm thế nào 'rawurlencode()' sửa chữa vấn đề của tôi. –

4

Trong Apache, AllowEncodedSlashes On sẽ ngăn yêu cầu được ngay lập tức bị từ chối với một 404.

Chỉ cần một ý tưởng về làm thế nào để sửa lỗi này.

2

Trên tài khoản lưu trữ của tôi, sự cố này là do quy tắc ModSecurity được đặt cho tất cả các tài khoản tự động. Khi tôi báo cáo sự cố này, quản trị viên của họ đã nhanh chóng xóa quy tắc này cho tài khoản của tôi.

-3

Bạn có thể sử dụng %2F nếu sử dụng nó theo cách này:
?param1=value1&param2=value%2Fvalue

nhưng nếu bạn sử dụng /param1=value1/param2=value%2Fvalue nó sẽ ném ra một lỗi.

3
$encoded_url = str_replace('%2F', '/', urlencode($url)); 
0

Giải pháp chuẩn cho vấn đề này là cho phép gạch chéo bằng cách làm cho thông số có thể chứa thông số cuối cùng trong url.

Đối với một url mã sản phẩm sau đó bạn sẽ có ...

mysite.com/product/details/PR12345/22 

Đối với cụm từ tìm kiếm bạn phải

http://project/search_exam/0/search_subject/0/keyword/Psychology/Management 

(Các từ khóa ở đây là Tâm lý/Quản lý)

Nó không phải là một số lượng lớn công việc để xử lý các thông số "có tên" đầu tiên sau đó concat những người còn lại được mã sản phẩm hoặc từ khóa.

Một số khung công tác có cơ sở này được tích hợp vào định nghĩa định tuyến của chúng.

Điều này không áp dụng cho trường hợp sử dụng liên quan đến hai tham số có chứa dấu gạch chéo của tôi.

3

Thay% 2F% với 252F sau khi mã hóa url

PHP

function custom_http_build_query($query=array()){ 

    return str_replace('%2F','%252F', http_build_query($query)); 
} 

Xử lý yêu cầu qua htaccess

.htaccess

RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC] 
RewriteRule . %1/%3 [R=301,L,NE] 

Tài

http://www.leakon.com/archives/865

+0

Giải pháp tốt nhất !! –

-1

tôi sử dụng chức năng javascript encodeURI() cho phần URL có dấu gạch chéo đó nên được xem như nhân vật thay vì địa chỉ http. Ví dụ:

"/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition") 

thấy http://www.w3schools.com/tags/ref_urlencode.asp

+0

vấn đề là xử lý URI sau khi nó được mã hóa thành% 2F - xem câu trả lời được chấp nhận 'Apache từ chối tất cả các URL có% 2F trong phần đường dẫn' – Jordan

0

Sử dụng một nhân vật khác nhau và thay thế phụ slashes máy chủ

ví dụ Drupal.org sử dụng% 21 (ký tự đánh dấu khai thác!) Để biểu diễn dấu gạch chéo trong tham số url.

Cả hai liên kết dưới đây làm việc:

https://api.drupal.org/api/drupal/includes%21common.inc/7

https://api.drupal.org/api/drupal/includes!common.inc/7

Nếu bạn đang lo lắng rằng nhân vật có thể xung đột với một nhân vật trong các tham số sau đó sử dụng một sự kết hợp của các nhân vật.

Vì vậy, url của bạn sẽ là http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two/new_search/1/search_exam/0/search_subject/0

thay đổi nó ra với js và chuyển đổi nó trở lại một phía máy chủ dấu gạch chéo.

3

tôi đã cùng một vấn đề với dấu gạch chéo trong url get param, trong trường hợp của tôi sau mã php hoạt động:

$value = "hello/world" 
$value = str_replace('/', '/', $value;?> 
$value = urlencode($value);?> 
# $value is now hello%26%2347%3Bworld 

đầu tiên tôi thay thế các dấu gạch chéo bởi thực thể html và sau đó tôi làm mã hóa url.

0

tôi giải quyết điều này bằng cách sử dụng 2 chức năng tùy chỉnh như sau:

function slash_replace($query){ 

    return str_replace('/','_', $query); 
} 

function slash_unreplace($query){ 

    return str_replace('_','/', $query); 
} 

Vì vậy, để mã hóa tôi có thể gọi:

rawurlencode(slash_replace($param)) 

và để giải mã tôi có thể gọi

slash_unreplace(rawurldecode($param); 

Cheers !

0

là đơn giản đối với tôi sử dụng base64_encode

$term = base64_encode($term) 
$url = $youurl.'?term='.$term 

sau khi bạn giải mã thuật ngữ

$term = base64_decode($['GET']['term']) 

cách này mã hóa "/" và "\"