64

über das SystemUrlencoded Schrägstrich bricht URL

ich URLs dieses Format in meinem Projekt habe: -

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

Wo Stichwort/Klasse Paar bedeutet Suche mit "Klasse" Schlüsselwort.

Ich habe eine gemeinsame Datei index.php, die für jedes Modul im Projekt ausgeführt wird. Es gibt nur eine Rewrite-Regel die index.php von URL zu entfernen: -

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

Ich verwende urlencode(), während die Suche URL und urldecode Herstellung von(), während der Such-URL zu lesen.

Problem

Nur der Schrägstrich bricht URLs Bewirken, dass 404-Seite nicht Fehler gefunden. Zum Beispiel, wenn ich one/two die URL zu suchen ist

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

Wie kann ich dieses Problem beheben? Ich muss index.php in der URL versteckt halten. Ansonsten wurde, wenn diese nicht benötigt werden, würde es mit Schrägstrich kein Problem gewesen, und ich konnte diese URL verwendet haben: -

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

Ich fühle mich ist es am besten haben URLs wie folgt: - 'http: // project_name/browse_by_exam? Type/tutor_search/keyword/class% 2Fneu/new_search/1/search_exam/0/search_subject/0' So werde ich das schwierige los y der Lesbarkeit verursacht durch & param1 = value1 & param2 = value2 Konvention und ich bin auch in der Lage, Schrägstriche zu erlauben (jetzt im Query String Teil mit '?') Ich würde AllowEncodedSlashes vermeiden, weil Bobince sagte 'Auch einige Werkzeuge oder Spinnen könnten verwirrt davon. Obwohl% 2F zu/in einem Pfadteil gemäß dem Standard korrekt ist, vermeidet das meiste des Webs es. " URL .htaccess URL-Routing –

+1

Sie können% 2F verwenden, wenn Verwendung auf diese Weise? Param1 = Wert1 & Param2 = Wert% 2FWert Wenn Sie jedoch /param1 = Wert1/Param2 = Wert% 2FWert verwenden, wird ein Fehler ausgegeben. – Ahmad

+0

Zugehörig: [Ist ein Schrägstrich ("/") einem codierten Schrägstrich ("% 2F") im Pfadabschnitt einer HTTP-URL] (http://stackoverflow.com/q/1957115/95735) –

Antwort

129

Apache bestreitet alle URLs mit %2F im Pfad Teil, aus Sicherheitsgründen: Skripte können Normalerweise (dh ohne Umschreiben) sagen Sie den Unterschied zwischen %2F und / aufgrund der PATH_INFO Umgebungsvariable automatisch URL-decodiert (das ist dumm, aber ein langjähriger Teil der CGI-Spezifikation, so dass nichts dagegen getan werden kann).

Sie können diese Funktion mit der Direktive AllowEncodedSlashes deaktivieren, beachten Sie jedoch, dass andere Webserver diese Funktion weiterhin deaktivieren (ohne die Option, dies auszuschalten) und dass andere Zeichen auch tabu sein können (z. B. %5C) dass %00 insbesondere immer von Apache und IIS blockiert wird. Wenn Ihre Anwendung sich also darauf verlassen könnte, %2F oder andere Zeichen in einem Pfadteil zu haben, würden Sie Ihre Kompatibilitäts-/Bereitstellungsoptionen einschränken.

Ich verwende urlencode(), während die URL Suche Vorbereitung

Sie sollten rawurlencode() verwenden, nicht urlencode() für Bahnteile zu entkommen. urlencode() ist falsch benannt, es ist tatsächlich für application/x-www-form-urlencoded Daten wie in der Abfragezeichenfolge oder der Körper einer POST-Anfrage und nicht für andere Teile der URL.

Der Unterschied ist, dass + nicht Leerzeichen in Pfadteilen bedeutet. rawurlencode() wird stattdessen korrekt produzieren, was sowohl in formcodierten Daten als auch in anderen Teilen der URL funktioniert.

+4

Ah, Deshalb wird der Schrägstrich abgelehnt. Perfekte Diagnose und Behandlung. –

+1

+1 Ich habe versucht, einige davon in einer seiner anderen Fragen zu erklären, aber Sie haben es viel kohärenter getan, als ich es konnte. –

+3

Hallo Bobince, 'rawurlencode()' konvertiert auch Schrägstriche nach '% 2F', was meine URL immer noch bricht. Ich habe eigentlich nicht verstanden, wie 'rawurlencode()' mein Problem behebt. –

4

In Apache, AllowEncodedSlashes On würde den Antrag wird sofort abgelehnt mit einer 404.

Just another Idee, wie man dieses Problem beheben verhindern.

2

Auf meinem Hosting-Konto wurde dieses Problem durch eine ModSecurity-Regel verursacht, die automatisch für alle Konten gesetzt wurde. Nachdem mein Problem gemeldet wurde, entfernte der Administrator diese Regel schnell für mein Konto.

-3

Sie können %2F verwenden, wenn es auf diese Weise mit:
?param1=value1&param2=value%2Fvalue

aber wenn Sie /param1=value1/param2=value%2Fvalue verwenden wird es einen Fehler aus.

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

Eine Standardlösung für dieses Problem besteht darin, Schrägstriche zuzulassen, indem der Parameter, der Schrägstriche enthalten kann, der letzte Parameter in der URL wird.

für ein URL-Produktcode, den Sie dann ...

mysite.com/product/details/PR12345/22 

für einen Suchbegriff haben würden Sie

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

(Das Schlüsselwort hier ist Psychologie/Management)

haben würde

Es ist keine große Arbeit, die ersten "benannten" Parameter zu verarbeiten und dann die restlichen als Produktcode oder Schlüsselwort zu bezeichnen.

In einigen Frameworks ist diese Funktion in ihre Routingdefinitionen integriert.

Dies gilt nicht für den Anwendungsfall mit zwei Parametern, die Schrägstriche enthalten.

3

Ersetzen% 2F% 252F mit nach URL-Codierung

PHP

function custom_http_build_query($query=array()){ 

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

die Anforderung über htaccess Griff

.htaccess

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

Ressourcen

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

+0

Beste Lösung !! –

-1

Ich benutze Javascript encodeURI() Funktion für den URL Teil, Schrägstriche hat, dass anstelle von http-Adresse als Zeichen gesehen werden sollte. Eg:

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

siehe http://www.w3schools.com/tags/ref_urlencode.asp

+0

das Problem ist mit der Behandlung der URI, nachdem es zu% 2F codiert ist - siehe akzeptierte Antwort 'Apache verweigert alle URLs mit% 2F im Pfad Teil' – Jordan

0

ein anderes Zeichen verwenden und die Schrägstriche Serverseite

ersetzen z.B. Drupal.org verwendet% 21 (das Exclamations-Zeichen!), Um den Schrägstrich in einem URL-Parameter darzustellen.

Sowohl die Links unten Arbeit:

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

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

Wenn Sie besorgt, dass das Zeichen mit einem Zeichen im Parameter kollidieren kann dann eine Kombination von Zeichen verwendet werden.

So würde Ihre URL http://project_name/browse_by_exam/type/tutor_search/keyword/one_-!two/new_search/1/search_exam/0/search_subject/0

Änderung mit js heraus und wandelt es wieder in einer Seite slash-Servers.

3

hatte ich das gleiche Problem mit Schrägstrich in param url get, in meinem Fall folgenden PHP-Code funktioniert:

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

ich den Schrägstrich von HTML-Entität zuerst ersetzen und dann mache ich die URL-Codierung.

0

Ich löste dies wie so 2 benutzerdefinierte Funktionen durch die Verwendung:

function slash_replace($query){ 

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

function slash_unreplace($query){ 

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

So nenne ich könnte zu kodieren:

rawurlencode(slash_replace($param)) 

und entschlüsseln konnte ich

slash_unreplace(rawurldecode($param); 

Prost nennen !

0

ist einfach für mich base64_encode

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

verwenden, nachdem Sie den Begriff

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

auf diese Weise codieren die "/" und "\"