it-swarm.com.de

Weiterleitung von URL mit Parametern zu SEO-freundlicher URL in .htaccess

Ich habe eine Kategorieseite mit dieser Struktur

example.com/Category.php?Category_Id=10&Category_Title=some-text

ich möchte Htaccess-Regeln schreiben, von denen umgeleitet werden soll

example.com/Category.php?Category_Id=10&Category_Title=some-text

dazu

example.com/Category/10/some-text

gibt es eine Möglichkeit, htaccess dazu zu zwingen? Ich will, wenn ich das besuche

example.com/Category.php?Category_Id=10&Category_Title=some-text

die Kategorieseite wird automatisch umgeleitet zu

example.com/Category/10/some-text

ich benutze diesen Htaccess-Code, aber er leitet die Seite nicht an die SEO-freundliche URL weiter

Options -Multiviews
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} !^exmaple\.com$
RewriteRule ^(.*) http://exmaple.com/$1 [R=301,L]

wie kann ich es tun?

5
Mohammadreza

tl; dr

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

ich habe den generierten Link von einer schlechten SEO-Struktur in eine SEO-freundliche Struktur geändert und es funktioniert

Fair genug, ich bin froh, dass Sie es in Ordnung gebracht haben. Ich nehme an, Sie verwenden eine Art CMS? (Dies fügte wahrscheinlich etwas zu Ihrem .htaccess hinzu, würde ich denken?)

Wie auch immer, um Ihre ersten Fragen zu beantworten ...

Me: Haben Sie die URL in Ihrer Anwendung bereits auf das "hübsche" Format geändert? z.B. Die URL, die dem Benutzer auf der Seite angezeigt wird, lautet example.com/Category/10/some-text, nicht example.com/Category.php?Category_Id=10&Category_Title=some-‌text?

Sie: Ja, aber es ist eine Menge. Ich muss alle URLs auf allen Seiten hübsch machen und ich mache das jetzt. Aber ich möchte wissen, ob es eine Htaccess-Lösung gibt. Ich mache es auch Sie sagen, dass das Ändern der URL auf allen Seiten die einzige Lösung ist ...

Obwohl es technisch möglich ist, dies ausschließlich in .htaccess zu implementieren, ohne die URLs in Ihrer Anwendung zu ändern, wird dies nicht empfohlen. Dies würde zu einer schlechten Benutzererfahrung führen und möglicherweise die SEO Ihrer Website schädigen.

Wenn Sie die URL in Ihrer Anwendung nicht geändert haben, wird jedes Mal, wenn ein Benutzer auf einen internen Link klickt, eine externe Umleitung (eine zweite Anforderung) zur kanonischen URL durchgeführt (bis die Umleitung zwischengespeichert wurde). Dies ist eine zusätzliche (unnötige) Anforderung auf Ihrem Server. Die alte URL wäre für den Benutzer sichtbar und kopierbar (zB "Linkadresse kopieren").

Normalerweise besteht der einzige Grund für die Implementierung einer solchen Umleitung darin, dass die alten URLs bereits verlinkt waren und/oder Suchmaschinen die alte URL-Struktur bereits indiziert hatten. Die Weiterleitung ist dann erforderlich, um SEO zu erhalten.

Internes Umschreiben (neue "hübsche" URL zu alter "hässlicher" URL)

Um eine benutzerfreundliche URL-Struktur wie diese zu implementieren, benötigen Sie ein internes Umschreiben , das die Anforderung aus der neuen "hübschen" URL stillschweigend zurückschreibt auf die alte "hässliche" (echte) URL. Der Benutzer sieht nur die neue "hübsche" URL. Aus Ihrer Frage geht hervor, dass Sie so etwas bereits hatten (vielleicht auch nicht)? Zum Beispiel:

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

$1 und $2 sind Rückverweise auf die erfassten Gruppen im Muster RewriteRule. dh \d+ und [\w-]+.

Wenn dies eine neue Site wäre, könnten Sie dort jedoch anhalten ...

Externe Weiterleitung (alte "hässliche" URL zu neuer "hübscher" URL) - optional

Diese Umleitung sollte vor der obigen Umschreibung in Ihrer .htaccess -Datei erfolgen:

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

Um den Teil der URL mit der Abfragezeichenfolge zu überprüfen, müssen Sie eine RewriteCond -Direktive verwenden und die Servervariable QUERY_STRING (das RewriteRule -Muster stimmt nur mit dem URL-Pfad-Teil der URL überein).

%1 und %2 sind Rückverweise auf die erfassten Gruppen im zuletzt übereinstimmenden CondPattern . dh \d+ und [\w-]+. Dies ist das Gegenteil des früheren Umschreibens.

Der ? am Ende der RewriteRule Ersetzung ist erforderlich, um die Abfragezeichenfolge aus der Anforderung zu entfernen. (Alternativ können Sie das Flag QSD unter Apache 2.4+ verwenden.)

PDATE: Die Bedingung , die anhand der Umgebungsvariablen REDIRECT_STATUS überprüft, stellt sicher, dass nur die ursprüngliche Anforderung umgeleitet wird und nicht die umgeschriebene Anfrage der späteren Direktive (so). Die Umgebungsvariable REDIRECT_STATUS ist bei der ersten Anforderung nicht vorhanden (dh leer) und wird erst nach der ersten internen Neuschreibung/Unteranforderung festgelegt. (In einem verzeichnisbezogenen Kontext (wie .htaccess) beginnt der Umschreibevorgang im Wesentlichen nach dem letzten RewriteRule von vorne und wird fortgesetzt, bis die URL unverändert durchlaufen wird. Das Flag L bewirkt einfach, dass der "aktuelle Durchlauf" durch den Umschreibungsprozess beendet wird, wodurch der Prozess effektiv neu gestartet wird, wobei die jetzt umgeschriebene URL als Eingabe verwendet wird.)

Zusammenfassung

Zusammen haben wir:

Options -Multiviews
RewriteEngine On

# Canonical www to non-www redirect
RewriteCond %{HTTP_Host} !^example\.com
RewriteRule (.*) http://exmaple.com/$1 [R=301,L]

# Redirect /Category.php?Category_Id=10&Category_Title=some-text
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^Category_Id=(\d+)&Category_Title=([\w-]+)$
RewriteRule ^Category\.php$ /Category/%1/%2? [R=301,L]

# Rewrite /Category/10/some-text
RewriteRule ^Category/(\d+)/([\w-]+)$ Category.php?Category_Id=$1&Category_Title=$2 [L]

MultiViews müssen deaktiviert sein (falls noch nicht geschehen), damit dieses Beispiel funktioniert.

4
MrWhite