Ü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 die Suche mit dem Schlüsselwort "Klasse" bedeutet.
Ich habe eine gemeinsame index.php-Datei, die für jedes Modul im Projekt ausgeführt wird. Es gibt nur eine Umschreiberegel, um die index.php von der 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 () beim Vorbereiten der Such-URL und urldecode () beim Lesen der Such-URL.
Problem
Nur das Schrägstrichzeichen unterbricht URLs, wodurch ein Fehler bei 404 Seiten nicht gefunden wird. Zum Beispiel, wenn ich suche, ist one/two
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 behebe ich das? Ich muss index.php in der URL versteckt halten. Wenn dies nicht erforderlich gewesen wäre, hätte es 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
quelle
http://project_name/browse_by_exam?type/tutor_search/keyword/class %2Fnew/new_search/1/search_exam/0/search_subject/0
diese Weise werde ich die Lesbarkeitsschwierigkeiten beseitigen, die durch die Konvention & param1 = value1 & param2 = value2 verursacht werden, und ich kann auch Schrägstriche zulassen (jetzt im Teil der Abfragezeichenfolge mit?
) I. würde AllowEncodedSlashes vermeiden, weil Bobince sagte,Also some tools or spiders might get confused by it. Although %2F to mean / in a path part is correct as per the standard, most of the web avoids it.
URL .htaccess URL-RoutingAntworten:
Apache lehnt
%2F
aus Sicherheitsgründen alle URLs im Pfad ab: Skripte können normalerweise nicht (dh ohne Umschreiben) den Unterschied zwischen%2F
und/
aufgrund derPATH_INFO
automatischen URL-Dekodierung der Umgebungsvariablen erkennen (was dumm, aber langjährig ist) Teil der CGI-Spezifikation, daher kann nichts dagegen unternommen werden.Sie können diese Funktion mithilfe der
AllowEncodedSlashes
Direktive deaktivieren. Beachten Sie jedoch, dass andere Webserver sie weiterhin nicht zulassen (ohne die Option, sie zu deaktivieren) und dass andere Zeichen möglicherweise ebenfalls tabu sind (z. B.%5C
), und dies%00
insbesondere immer wird sowohl von Apache als auch von IIS blockiert. Wenn sich Ihre Anwendung darauf verlassen%2F
würde, dass ein Pfadteil andere Zeichen enthalten könnte, würden Sie Ihre Kompatibilitäts- / Bereitstellungsoptionen einschränken.Sie sollten verwenden
rawurlencode()
, nichturlencode()
zum Entkommen von Pfadteilen.urlencode()
ist falsch benannt, gilt dies tatsächlich fürapplication/x-www-form-urlencoded
Daten wie in der Abfragezeichenfolge oder im Hauptteil einer POST-Anforderung und nicht für andere Teile der URL.Der Unterschied besteht darin, dass in
+
Pfadteilen kein Platz vorhanden ist.rawurlencode()
wird%20
stattdessen korrekt erzeugt , was sowohl in formularcodierten Daten als auch in anderen Teilen der URL funktioniert.quelle
rawurlencode()
konvertiert auch Schrägstriche,%2F
die meine URL immer noch beschädigen . Ich habe eigentlich nicht verstanden, wierawurlencode()
ich mein Problem beheben kann.+
vs. zu tun hat%20
. Das Update istAllowEncodedSlashes
, obwohl das Verlassen darauf Ihre Bereitstellungsmöglichkeiten verringert (dh Sie können es nicht auf IIS bereitstellen, und andere Benutzer - falls vorhanden - können es nicht bereitstellen, wenn sie Shared Hosting ohne Zugriff verwenden zumhttpd.conf
). Auch einige Werkzeuge oder Spinnen könnten dadurch verwirrt werden. Obwohl%2F
es/
gemäß dem Standard korrekt ist , in einem Pfad zu bedeuten, wird dies im größten Teil des Webs vermieden.%00
,%2F
und%5C
wird IIS auch Probleme geben Sie mit Nicht-ASCII - Byte - Sequenzen in dem Pfad, der nicht gültig UTF-8 - Sequenzen sind.Ersetzen Sie% 2F nach der URL-Codierung durch% 252F
PHP
Behandeln Sie die Anfrage über htaccess
.htaccess
Ressourcen
http://www.leakon.com/archives/865
quelle
In Apache würde AllowEncodedSlashes On verhindern, dass die Anforderung sofort mit einem 404 abgelehnt wird.
Nur eine weitere Idee, wie dies behoben werden kann.
quelle
quelle
Ich hatte das gleiche Problem mit Schrägstrich in URL get param, in meinem Fall funktioniert folgender PHP-Code:
Ich ersetze zuerst den Schrägstrich durch eine HTML-Entität und mache dann die URL-Codierung.
quelle
Auf meinem Hosting-Konto wurde dieses Problem durch eine ModSecurity-Regel verursacht, die automatisch für alle Konten festgelegt wurde. Nachdem ich dieses Problem gemeldet habe, hat der Administrator diese Regel für mein Konto schnell entfernt.
quelle
Verwenden Sie ein anderes Zeichen und ersetzen Sie die Schrägstriche auf der Serverseite
Beispiel: Drupal.org verwendet% 21 (das Ausrufezeichen!), 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 kollidiert, verwenden Sie eine Zeichenkombination.
Ihre URL wäre also http: // Projektname / browse_by_exam / type / tutor_search / keyword / one_-! Two / new_search / 1 / search_exam / 0 / search_subject / 0
Ändern Sie es mit js und konvertieren Sie es zurück in einen Slash-Server.
quelle
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, eines Tages passiert zu werden, wenn Sie den Server wechseln.
Der beste Weg, den ich gefunden habe, besteht darin, den Parameter einfach in die Basis-64-Codierung zu konvertieren. In meinem Fall rufe ich einen PHP-Dienst von Angular auf und übergebe einen Parameter, der einen beliebigen Wert enthalten kann.
Mein Typoskript-Code im Client sieht also folgendermaßen aus:
Und um den Parameter in PHP abzurufen:
quelle
Eine Standardlösung für dieses Problem besteht darin, Schrägstriche zuzulassen, indem der Parameter, der Schrägstriche enthalten kann, zum letzten Parameter in der URL gemacht wird.
Für eine Produktcode-URL hätten Sie dann ...
Für einen Suchbegriff hätten Sie
(Das Schlüsselwort hier ist Psychologie / Management)
Es ist kein großer Arbeitsaufwand, die ersten "benannten" Parameter zu verarbeiten und die verbleibenden als Produktcode oder Schlüsselwort zu betrachten.
Einige Frameworks haben diese Funktion in ihre Routing-Definitionen integriert.
Dies gilt nicht für Anwendungsfälle mit zwei Parametern, die Schrägstriche enthalten.
quelle
ist einfach für mich benutze base64_encode
nachdem Sie den Begriff entschlüsselt haben
auf diese Weise codieren Sie die "/" und "\"
quelle
Ich verwende die Javascript-Funktion encodeURI () für den URL-Teil, der Schrägstriche enthält, die als Zeichen anstelle der http-Adresse angezeigt werden sollten. Z.B:
Siehe http://www.w3schools.com/tags/ref_urlencode.asp
quelle
Apache denies all URLs with %2F in the path part
Ich habe dies gelöst, indem ich 2 benutzerdefinierte Funktionen wie folgt verwendet habe:
Zum Codieren könnte ich also anrufen:
und zum dekodieren konnte ich anrufen
Prost!
quelle
Sie können
%2F
Folgendes verwenden:?param1=value1¶m2=value%2Fvalue
aber wenn Sie es verwenden
/param1=value1/param2=value%2Fvalue
, wird ein Fehler ausgelöst.quelle