2008-11-22 52 views
13

tôi đang cố gắng để tạo ra một chuỗi url mà làm việc như thế này:url mã hóa phía trước dấu gạch chéo phá ứng dụng CodeIgniter tôi

/app/process/example.com/index.html 

nên nói cách khác,

/app/process/$URL 

tôi sau đó lấy url với

$this->uri->segment(3); 

dấu gạch chéo chuyển tiếp trong URL dĩ nhiên sẽ là vấn đề khi truy cập phân đoạn uri, vì vậy tôi sẽ đi ahea d và url mã hóa phần URL:

/app/process/example.com%2Findex.html 

.. nhưng bây giờ tôi chỉ nhận được 404 nói ...

Not Found 

The requested URL /app/process/example.com/index.html was not found on this server. 

dường như mã hóa url của tôi về phía trước chém vỡ URI phân tích cú pháp của CI.

tôi có thể làm gì để khắc phục sự cố này?

Trả lời

0

Với CodeIgniter, đường dẫn của URL tương ứng với một bộ điều khiển, một chức năng trong bộ điều khiển và các tham số cho hàm.

URL của bạn, /app/process/example.com/index.html, sẽ tương ứng với bộ điều khiển app.php, quá trình chức năng bên trong, và hai tham số example.com và index.html:

<?php 
class App extends Controller { 
    function process($a, $b) { 
     // at this point $a is "example.com" and $b is "index.html" 
    } 
} 
?> 

chỉnh sửa: Khi đọc lại câu hỏi của bạn, có vẻ như bạn muốn diễn giải một phần URL như một URL khác. Để làm điều này, bạn cần phải viết hàm của bạn để có một số lượng đối số biến. Để làm điều này, bạn có thể sử dụng các chức năng func_num_args và func_get_arg như sau:

<?php 
class App extends Controller { 
    function process() { 
     $url = ""; 
     for ($i = 0; $i < func_num_args(); $i++) { 
      $url .= func_get_arg($i) . "/"; 
     } 

     // $url is now the url in the address 
    } 
} 
?> 
9

Tôi nghĩ rằng các thông báo lỗi bạn đang nhận được không phải là từ codeigniter nhưng từ máy chủ web của bạn.

Tôi đã sao chép điều này bằng cách sử dụng Apache2 mà không cần sử dụng CodeIgniter: Tôi đã tạo tệp index.php và sau đó truy cập index.php/a/b/c - nó hoạt động tốt. Nếu sau đó tôi đã cố gắng truy cập index.php/a/b/c%2F Tôi đã nhận được 404 từ Apache.

Tôi giải quyết nó bằng cách thêm vào cấu hình Apache của tôi:

AllowEncodedSlashes On

Xem the documentation để biết thêm thông tin

Một khi bạn đã làm điều này bạn có thể cần phải fiddle xung quanh với $config['permitted_uri_chars'] trong CodeIgniter nếu nó vẫn không hoạt động - bạn có thể thấy các dấu gạch chéo bị lọc ra

+1

này là đúng. Tuy nhiên ngay cả khi cố định bạn có thể gặp vấn đề, như tiêu chuẩn CGI định nghĩa PATH_INFO yêu cầu các chuỗi đi qua một vòng giải mã URL, có thể phá vỡ dấu gạch chéo. Trên Apache chỉ, bạn có thể sử dụng REQUEST_URI thay vì không bị điều này ... dunno nếu CI có thể sử dụng tho đó. – bobince

+3

Tôi vừa khắc phục sự cố này trên một trang web. Đây là một chút của một hack, nhưng nó đã hoàn thành công việc: Tôi double urlencoded URL. Bằng cách đó, urldecode của REQUEST_URI không hoàn nguyên/quá sớm. –

+0

Trên thực tế, những gì bạn muốn có lẽ là 'AllowEncodedSlashes NoDecode' – celwell

4

Một cách để giải quyết vấn đề này là thay thế bất kỳ dấu gạch chéo nào trong U của bạn Biến RL mà bạn đang truyền trong các phân đoạn URI với một thứ không thể phá vỡ trình phân tích cú pháp CodeIgniter URI. Ví dụ:


$uri = 'example.com/index.html'; 
$pattern = '"/"'; 
$new_uri = preg_replace($pattern, '_', $uri); 

Điều này sẽ thay thế tất cả dấu gạch chéo tiến của bạn bằng dấu gạch dưới. Tôi chắc chắn nó tương tự như những gì bạn đang làm để mã hóa các dấu gạch chéo về phía trước của bạn.Sau đó, khi truy xuất giá trị trên trang khác, chỉ cần sử dụng một số thông tin như sau:


$pattern = '/_/'; 
$old_uri = preg_replace($pattern, '/', $new_uri); 

Điều này sẽ thay thế tất cả dấu gạch dưới bằng dấu gạch chéo để lấy lại URI cũ của bạn. Tất nhiên, bạn sẽ muốn đảm bảo rằng bất kỳ ký tự nào bạn sử dụng (gạch dưới trong trường hợp này) sẽ không có mặt trong bất kỳ URI nào bạn có thể chuyển qua (vì vậy có thể bạn sẽ không muốn sử dụng dấu gạch dưới).

0

Thay đổi chỉ số permitted_uri_chars của bạn trong tập tin cấu hình

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; 
Các vấn đề liên quan