.htaccess-Regeln zum Umschreiben des Verzeichnisses als Abfragevariable

.htaccess-Regeln zum Umschreiben des Verzeichnisses als Abfragevariable

Unsere Site verwendet das folgende Schema:

example.com/channels/channel_name?v=videoId

Ich möchte das channel_nameVerzeichnis erfassen und es wie folgt als Abfragevariable neu schreiben können:

example.com/channels?watch=channel_name&v=videoId

Was wäre die richtige .htaccessSyntax, um alle nachfolgenden Parametervariablen beizubehalten und gleichzeitig die Transformation vor dem Benutzer zu verbergen?

Antwort1

example.com/channels?watch=channel_name&v=videoId

Es ist immer noch unklar, was Sie hier genau versuchen, da Sie das Skript (d. h. den Front-Controller) nicht identifiziert haben, das diese Anforderung tatsächlich verarbeiten würde. Wie heißt das Skript, das die URL-Parameter liest und letztendlich den Inhalt bereitstellt?

Sie haben angegeben, dass es /channelssich um ein physisches Verzeichnis im Dateisystem handelt (der URL-Pfad müsste also mindestens mit einem Schrägstrich enden, d. h. /channels/?watch=channel_name&v=videoId), daher ist dies strenggenommen kein gültiger Endpunkt für eine Neuschreibung (da noch eine zusätzliche Neuschreibung des Skripts erforderlich ist, das tatsächlich etwas tun würde). Es müsste folgende Form haben (unter der Annahme von PHP):

example.com/channels/front-controller.php?watch=channel_name&v=videoId

Wo front-controller.phpist das Skript, das die Anfrage tatsächlich bearbeitet (also dasFront-Controller).

Um dieses Umschreiben (von /channels/channel_name?v=videoId) zu erreichen, könnten Sie in der Stammdatei etwa Folgendes tun .htaccess:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]

Wobei „“ channel_nameaus den Zeichen „“ a-z, „ A-Z0-9und „“ bestehen kann _(was Ihre Beispiel-URL abdeckt).

/channels/front-controller.phpist das Skript, das die Anfrage tatsächlich bearbeitet und den Inhalt zurückgibt. Obwohl es sich überall befinden kann, muss es nicht im /channelsVerzeichnis sein (tatsächlich wäre es einfacher, wenn es nicht dort wäre – um potenzielle Konflikte zu vermeiden).

%1ist eine Rückreferenz auf die erfasste Gruppe im vorhergehendenBedingungsmuster. also der Wert v=videoId. Spart Wiederholungen.

Das ist eininternes Umschreiben- die URL, die der Benutzer sieht, bleibt als /channels/channel_name?v=videoId.

Ich habe eine Workaround-Lösung:

RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]

Obwohl dies eineexterne Weiterleitung- die URL, die der Benutzer sieht, wird zur neuen URL geändert. Welche Datei verarbeitet in diesem Fall die Anfrage? Ist der v=videoIdParameter nicht erforderlich?

verwandte Informationen