it-swarm.dev

urlencoded Der Schrägstrich ist eine fehlerhafte URL

Über das System

Ich habe URLs dieses Formats in meinem Projekt: -

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

Wobei Schlüsselwort/Klassenpaar Suche mit Schlüsselwort "class" bedeutet.

Ich habe eine gemeinsame Datei index.php, die für jedes Modul im Projekt ausgeführt wird. Es gibt nur eine Umschreibungsregel zum Entfernen der index.php von der URL: -

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

Ich verwende urlencode () beim Vorbereiten der Such-URL und urldecode () beim Lesen der Such-URL.

Problem

Nur der Schrägstrich "Schrägstrich" führt zu fehlerhaften URLs, die zu einem Fehler bei der 404-Seite führen. Wenn ich beispielsweise one/two suche, lautet die URL 

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 das beheben? Ich muss index.php in der URL verborgen halten. Wenn dies nicht erforderlich wäre, hätte es sonst kein Problem mit dem Schrägstrich gegeben und ich hätte diese URL verwenden können: -

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

Aus Sicherheitsgründen verweigert Apache alle URLs mit %2F im Pfadteil: Skripts können normalerweise (dh ohne Umschreiben) nicht zwischen %2F und / unterscheiden, da die Umgebungsvariable PATH_INFO automatisch URL-decodiert ist (was dumm ist, aber dumm ist.) ein seit langem bestehender Teil der CGI-Spezifikation, sodass nichts dagegen unternommen werden kann).

Sie können diese Funktion mit der Direktive AllowEncodedSlashes deaktivieren. Beachten Sie jedoch, dass andere Webserver dies immer noch nicht zulassen (ohne Option zum Deaktivieren), und dass andere Zeichen auch tabu sein können (z. B. %5C) und insbesondere %00 wird sowohl von Apache als auch von IIS gesperrt. Wenn Ihre Anwendung also darauf angewiesen ist, %2F oder andere Zeichen in einem Pfadteil enthalten zu können, würden Sie Ihre Kompatibilitäts-/Bereitstellungsoptionen einschränken.

Ich verwende urlencode (), während ich die Such-URL vorbereite

Sie sollten rawurlencode() verwenden, nicht urlencode(), um Wegteile zu umgehen. urlencode() ist falsch benannt, es handelt sich tatsächlich um application/x-www-form-urlencoded-Daten, beispielsweise in der Abfragezeichenfolge oder im Hauptteil einer POST Anforderung, und nicht für andere Teile der URL.

Der Unterschied ist, dass + in Pfadteilen keinen Platz bedeutet. rawurlencode() erzeugt stattdessen korrekt %20, was sowohl in formcodierten Daten als auch in anderen Teilen der URL funktioniert.

137
bobince

Ersetzen Sie% 2F durch% 252F nach der URL-Kodierung

PHP

function custom_http_build_query($query=array()){

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

Behandeln Sie die Anfrage über htaccess

.htaccess

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

Ressourcen

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

7
RafaSashi

In Apache verhindert AllowEncodedSlashes On, dass die Anforderung sofort mit einem 404 abgelehnt wird.

Nur eine weitere Idee, wie man das beheben kann.

4
Paul Jennings
$encoded_url = str_replace('%2F', '/', urlencode($url));
3
CpnCrunch

Ich hatte das gleiche Problem mit dem Schrägstrich in der URL get param. In meinem Fall funktioniert der folgende PHP-Code:

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

Ich ersetze zuerst den Schrägstrich durch HTML-Entität und dann mache ich die URL-Kodierung. 

3

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

2
Roman

Verwenden Sie ein anderes Zeichen und ersetzen Sie die Schrägstrich-Serverseite

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

Beide Links funktionieren:

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

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

Wenn Sie befürchten, dass das Zeichen mit einem Zeichen im Parameter kollidieren kann, verwenden Sie eine Kombination von Zeichen.

Ihre URL wäre also http: // Projektname/browse_by_exam/type/tutor_search/Schlüsselwort/one_-! Two/new_search/1/search_exam/0/Suchsubjekt/0

Ändern Sie es mit js und konvertieren Sie es zurück in eine Schrägstrich-Serverseite.

1
chim

Eine Standardlösung für dieses Problem besteht darin, Schrägstriche zuzulassen, indem der Parameter, der möglicherweise Schrägstriche enthält, der letzte Parameter in der URL ist.

Für eine Produktcode-URL müssten Sie dann ...

mysite.com/product/details/PR12345/22

Für einen Suchbegriff hätten Sie

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

(Das Stichwort ist hier Psychologie/Management)

Es ist nicht viel Arbeit, die ersten "benannten" Parameter zu verarbeiten und dann die verbleibenden Parameter als Produktcode oder Schlüsselwort festzulegen.

In einigen Frameworks ist diese Funktion in ihre Routing-Definitionen integriert.

Dies gilt nicht für den Anwendungsfall, der zwei Parameter enthält, die Schrägstriche enthalten.

0
chim

ist einfach für mich base64_encode

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

nachdem Sie den Begriff dekodiert haben

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

auf diese Weise das "/" und "\" kodieren

Hier ist meine bescheidene Meinung. !!!! Nicht !!!! Ändern Sie die Einstellungen auf dem Server, damit Ihre Parameter ordnungsgemäß funktionieren. Dies ist eine Zeitbombe, die darauf wartet, dass sie eines Tages beim Serverwechsel eintritt.

Der beste Weg, den ich gefunden habe, besteht darin, den Parameter einfach in eine Base-64-Codierung umzuwandeln. In meinem Fall rufe ich einen PHP-Dienst von Angular aus auf und übergebe einen Parameter, der einen beliebigen Wert enthalten kann.

Mein TypeScript-Code im Client sieht also folgendermaßen aus:

    private encodeParameter(parm:string){
    if (!parm){
        return null;
    }
    return btoa(parm);
}

Und um den Parameter in PHP abzurufen:

    $item_name = $request->getAttribute('item_name');
    $item_name = base64_decode($item_name); 
0
Jon Vote