Frage

Wir haben eine PHP-Anwendung mit einem dynamischen URL-Schema, das Zeichen sein Prozent-codierte, auch „ nicht reservierte Zeichen “ wie Klammern oder aphostrophes, die eigentlich nicht benötigt werden codiert werden. URLs, die die App für die Regelung des „falschen“ Weg verschlüsselt werden soll, kanonisch und dann nach „rechts“ umgeleitet codiert.

Aber Google und anderen Benutzeragenten werden canonicalize Prozent-Codierung / Decodierung unterschiedlich, was bedeutet, wenn Googlebot die Seite anfordert wird es für die „falsche“ URL fragen, und wenn es zurückkommt, eine Umleitung auf die „richtige“ URL, Googlebot sich weigern, die Umleitung zu folgen und sich weigern, die Seite zu indizieren.

Ja, das ist ein Fehler auf unserer Seite. Die HTTP-Spezifikationen erfordern, dass die Server behandeln Prozent-codiert und nicht-Prozent-encoded unreserved Zeichen identisch. Aber das Problem zu lösen in dem App-Code ist nicht einfach jetzt, so dass ich eine Codeänderung zu vermeiden, habe gehofft, durch eine Apache-Rewrite-Regel verwenden, die dafür sorgen würde, dass URLs codiert werden „richtig“ aus dem Point-of-view des App , dass apopstrophes Sinn, Klammern, etc. sind alle Prozent-codiert und dass die Räume als + und nicht %20 codiert.

Hier ist ein Beispiel, wo ich die ersten neu schreiben will und mit der zweiten Form am Ende:

  • www.splunkbase.com/apps/All/4.x/Add-On/app:OPSEC+LEA+for+Check+Point+ (Linux)
  • www.splunkbase.com/apps/All/4.x/Add-On/app:OPSEC+LEA+for+Check+Point+%28Linux%29

Hier ist eine andere:

  • www.splunkbase.com/apps/All/4.x/app:Benford's+Law+Fraud+Detection+Add-on
  • www.splunkbase.com/apps/All/4.x/app:Benford%27s+Law+Fraud+Detection+Add-on

Hier ist eine andere:

  • www.splunkbase.com/apps/All/4.x/app:Benford%27s%20Law%20Fraud%20Detection%20Add-on
  • www.splunkbase.com/apps/All/4.x/app:Benford%27s+Law+Fraud+Detection+Add-on

Wenn die App nur die zweite Form dieser URLs sieht, dann wird es keine Umleitungen senden und Google wird die Seite zu indizieren können.

Ich bin ein Neuling mit Rewrite-Regeln, und es war klar von meinem Lesen des

War es hilfreich?

Lösung

Die Lösung kann eigentlich recht einfach sein, obwohl es funktioniert nur in Apache 2.2 und später aufgrund der Verwendung der B Flagge . Ich bin nicht sicher, ob es mich um jeden Fall nimmt richtig (zugegebenermaßen bin ich ein wenig skeptisch, es nicht mehr Arbeit, als dies zu bedeuten hat), aber ich bin zu dem Glauben verleitet es durch den Quellcode sollte.

Beachten Sie auch, dass der Wert von REQUEST_URI nicht durch mod_rewrite Transformationen aktualisiert wird, so dass, wenn Ihre Anwendung auf diesem Wert setzt die angeforderte URL zu bestimmen, die vorgenommenen Änderungen werden nicht sichtbar sowieso sein.

Die gute Nachricht ist, dass dies in .htaccess getan werden kann, so haben Sie die Möglichkeit unberührt, die Hauptkonfiguration zu verlassen, ob das funktioniert besser für Sie.

RewriteEngine On

# Make sure this is only done once to avoid escaping the escapes...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Check if we have anything to bother escaping (likely unnecessary...)
RewriteCond $0 [^\w]+
# Rewrite the entire URL by escaping the backreference
RewriteRule ^.*$ $0 [B]

Also, warum ist es eine Notwendigkeit, die B Flagge zu verwenden, anstatt die neu geschrieben URL zu lassen, automatisch mod_rewrite zu entkommen? Wenn mod_rewrite automatisch die URL entkommt, verwendet es ap_escape_uri (die offenbar in einem Makro für ap_os_escape_path aus irgendeinem Grund gedreht wurde ...), eine Funktion, die eine begrenzte Teilmenge von Zeichen entkommt. Die B Flagge verwendet jedoch eine interne Modulfunktion genannt escape_uri, die das Angebot von auf PHP modelliert urlencode Funktion.

Die Umsetzung der escape_uri im Modul legt nahe, dass alphanumerischen Zeichen und Unterstrichen bleiben wie sie ist, Räume + umgewandelt werden, und alles, was zu seiner entkam Äquivalent umgewandelt wird. Dies scheint das Verhalten zu sein, dass Sie wollen, so vermutlich sollte es funktionieren.

Wenn nicht, haben Sie die Möglichkeit haben, ein externes Programm einrichten RewriteMap das könnte Ihre eingehende URLs in das richtige Format manipulieren. Dies erfordert allerdings das Apache-Konfigurations Manipulieren und ein Abtrünniger Skript könnte Probleme für den Server im Großen und Ganzen führen, so dass ich es eine ideale Lösung nicht berücksichtigen, wenn es vermieden werden kann.

Andere Tipps

mod_rewrite ist nicht das beste Werkzeug, um diese Art von Arbeit zu tun. Denn mit mod_rewrite Sie einen festen Betrag an Ereignissen zu einem Zeitpunkt nur ersetzen können. Aber es ist möglich:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]*)%20([^?\ ]*)
RewriteRule ^ /%1+%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*)
RewriteRule ^ /%1\%27%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*)
RewriteRule ^ /%1\%28%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*)
RewriteRule ^ /%1\%29%2 [R=301,NE]

Das wird eine %20, ', ( oder ) zu einem Zeitpunkt, und antwortet mit einer 301-Weiterleitung ersetzen. Also, wenn ein URL-Pfad 10 Zeichen enthält, die ersetzt werden muss, braucht es 10 Umleitungen zu tun.

Da dies vielleicht nicht die beste Lösung sein, ist es möglich, alle Ersatz mit Ausnahme der letzten internen Verwendung der N Flagge und nur der letzte Austausch von außen mit einer Umleitung:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /(([^?%\ ]|%(2[1-9a-fA-F]|[013-9][0-9a-fA-F]))*)%20(([^?%\ ]|%(2[1-9a-fA-F]|[013-9][0-9a-fA-F]))*%20[^?\ ]*)
RewriteRule ^ /%1+%4 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?\ ]*)%20([^?\ ]*)[?\ ]
RewriteRule ^ /%1+%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*'[^?\ ]*)
RewriteRule ^ /%1\%27%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?'\ ]*)'([^?'\ ]*)[?\ ]
RewriteRule ^ /%1\%27%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*\([^?\ ]*)
RewriteRule ^ /%1\%28%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?(\ ]*)\(([^?(\ ]*)[?\ ]
RewriteRule ^ /%1\%28%2 [R=301,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*\)[^?\ ]*)
RewriteRule ^ /%1\%29%2 [N,NE]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^?)\ ]*)\)([^?)\ ]*)[?\ ]
RewriteRule ^ /%1\%29%2 [R=301,NE]

Aber mit der N Flag kann gefährlich sein, wie es und so leicht nicht den internen Rekursionszähler erhöhen kann unendliche Rekursion führen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top