2 Stimmen

Ersetzen Sie %26 in htaccess durch %2526

Ich importiere eine Reihe von Seiten, die Ampersands im Titel haben, aus Mediawiki. Diese sind kodiert als %26 . Drupal hat aus verschiedenen Gründen beschlossen, die URL doppelt zu kodieren, so dass sie zu %2526 . Ich kann einfach nicht die alaises innerhalb von Drupal erstellen, so muss ich htaccess verwenden.

Ich brauche example.com/something_%26_else zu werden example.com/something_%2526_else . Dies ist meine bisherige Regel:

RewriteRule ^w/([^%26]+)\%26(.*)$ w/$1\%2526$2 [R=301]

Ich weiß die Hilfe zu schätzen.

0voto

RoUS Punkte 1756

Versuchen Sie, den 'look-behind'-Mechanismus mit einer RewriteCond und die NEXT Flagge, um den URI in einer Schleife zu durchlaufen und die %26 in %2526 zu ändern:

RewriteCond "\%(?<=25)26"
RewriteRule "^(w/.*)\%(?<=25)(26.*)" "$1\%25$2" [N]

0voto

MrWhite Punkte 33983

So leiten Sie eine Anfrage para /<something>%26<something> a /<something>%2526<something> dann können Sie mit mod_rewrite etwas wie das Folgende tun:

RewriteRule (.+)&(.+) /$1\%26$2 [R,L]

Le site RewriteRule Muster stimmt mit dem %-dekodierten URL-Pfad überein (d. h.. & pas %26 ). Sie sollten also einfach angeben & (Ampersand) wörtlich. Beachten Sie, dass dies eine Anfrage für beide übereinstimmen wird /something_%26_else y /something_&_else (seit & muss nicht in der Anfrage kodiert werden).

Le site % (Prozent) in der RewriteRule Substitution muss mit einem Schrägstrich versehen werden, um einen wörtlichen Ausdruck darzustellen % sonst wird es als Rückverweis auf das letzte übereinstimmende Ergebnis gewertet CondPattern und die gibt es nicht, also %2 würde sonst eine leere Zeichenkette werden!

Standardmäßig kodiert mod_rewrite automatisch die Ersetzungs-URL, was wir in diesem Fall auch wollen: %26 wird (doppelt) kodiert als %2526 .


Wenn Sie speziell ein Schleifenkonstrukt benötigen, wenn Sie zum Beispiel %26 mehr als einmal in der angeforderten URL vorkommen kann, können Sie stattdessen etwas wie das Folgende tun:

# 1. Looping construct to replace all "&" (decoded %26)
RewriteRule (.+)&(.+) $1\%26$2 [N,E=REPLACED:yes]

# 2. Finally redirect. Substitution is only URL-encoded at this stage.
RewriteCond %{ENV:REPLACED} yes
RewriteRule (.*) /$1 [R,L]

Weitere Erklärungen und Alternativen finden Sie in meiner Antwort auf dieselbe Frage auf dem Pro Webmasters Stack:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X