Unsere Site verwendet das folgende Schema:
example.com/channels/channel_name?v=videoId
Ich möchte das channel_name
Verzeichnis erfassen und es wie folgt als Abfragevariable neu schreiben können:
example.com/channels?watch=channel_name&v=videoId
Was wäre die richtige .htaccess
Syntax, 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 /channels
sich 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.php
ist 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_name
aus den Zeichen „“ a-z
, „ A-Z
“ 0-9
und „“ bestehen kann _
(was Ihre Beispiel-URL abdeckt).
/channels/front-controller.php
ist das Skript, das die Anfrage tatsächlich bearbeitet und den Inhalt zurückgibt. Obwohl es sich überall befinden kann, muss es nicht im /channels
Verzeichnis sein (tatsächlich wäre es einfacher, wenn es nicht dort wäre – um potenzielle Konflikte zu vermeiden).
%1
ist 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=videoId
Parameter nicht erforderlich?