2008-11-22 6 views
13

ich versuche, eine URL-Zeichenfolge zu erstellen, die wie folgt funktioniert:url codiert vorwärts Schrägstriche meine codeigniter app brechen

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

so in anderen Worten,

/app/process/$URL 

ich die URL dann abrufen mit

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

die Schrägstriche in der URL wird natürlich ein Problem beim Zugriff auf uri Segmente sein, ich werde ahea so gehen d und URL kodieren die URL Teil:

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

.. aber jetzt bekomme ich nur ein 404 sagen ...

Not Found 

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

es scheint, dass meine URL-Codierung von Slashes bricht CI URI-Parser.

Was kann ich tun, um dieses Problem zu umgehen?

Antwort

0

Mit CodeIgniter entspricht der Pfad der URL einem Controller, einer Funktion im Controller und den Parametern der Funktion.

Ihre URL, /app/process/example.com/index.html, entspräche den app.php Controller, die Prozessfunktion innerhalb und zwei Parameter example.com und index.html:

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

bearbeiten: Wenn Sie Ihre Frage erneut lesen, scheint es so, als ob Sie einen Teil der URL als eine andere URL interpretieren möchten. Um dies zu tun, müssen Sie Ihre Funktion schreiben, um eine variable Anzahl von Argumenten zu nehmen. Dazu können Sie die Funktionen func_num_args und func_get_arg wie folgt verwenden:

<?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

Ich denke, die Fehlermeldung Sie bekommen nicht von codeigniter ist aber von Ihrem Webserver.

Ich repliziert dies mit Apache2 ohne CodeIgniter sogar: Ich erstellte eine Datei index.php, und dann zugegriffen index.php/a/b/c - es hat gut funktioniert. Wenn ich dann versuchte, auf index.php/a/b/c%2F zuzugreifen, bekam ich einen 404 von Apache.

ich es gelöst, indem zu meinem Apache-Konfiguration:

AllowEncodedSlashes On

the documentation Für weitere Informationen siehe

Sobald Sie dies getan haben Sie vielleicht mit $config['permitted_uri_chars'] in codeigniter Geige brauchen um, wenn es funktioniert immer noch nicht - Sie werden vielleicht feststellen, dass die Schrägstriche herausgefiltert werden

+1

Das ist richtig. Aber auch wenn sie behoben sind, können Probleme auftreten, da der CGI-Standard, der PATH_INFO definiert, Strings benötigt, die eine Runde URL-Decodierung durchlaufen, die den Schrägstrich durchbrechen kann. Nur auf Apache können Sie stattdessen REQUEST_URI verwenden, das nicht darunter leidet ... weiß nicht, ob CI das tho verwenden kann. – bobince

+3

Ich habe gerade dieses Problem auf einer Website behoben. Das ist ein bisschen wie ein Hack, aber es hat den Job erledigt: Ich verdopple die URL doppelt. Auf diese Weise kehrt der URL-Code von REQUEST_URI das/s nicht zu früh zurück. –

+0

Eigentlich, was Sie wollen, ist wahrscheinlich 'AllowEncodedSlashes NoDecode' – celwell

4

Eine Möglichkeit, dieses Problem zu umgehen, wäre es, alle Schrägstriche in Ihrem U zu ersetzen RL-Variable, die Sie in den URI-Segmenten mit etwas übergeben, das den CodeIgniter-URI-Parser nicht beschädigen würde. Beispiel:


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

Dadurch werden alle Schrägstriche durch Unterstriche ersetzt. Ich bin mir sicher, dass es ähnlich zu dem ist, was Sie tun, um Ihre Vorwärtsstriche zu kodieren.Wenn dann wie folgt aus, um den Wert auf der anderen Seite einfach etwas Abrufen:


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

, die alle Unterstrichen ersetzt durch Slashes alten URI zurück zu bekommen. Natürlich sollten Sie sicherstellen, dass das von Ihnen verwendete Zeichen (in diesem Fall Unterstreichung) in keinem der möglichen URIs enthalten ist, die Sie übergeben (Sie werden also wahrscheinlich keinen Unterstrich verwenden).

0

Ihre permitted_uri_chars Index in Config-Datei ändern

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';