5 Stimmen

PHP .htaccess -> hübsche Url (in umgekehrter Reihenfolge)

Ich weiß zum Beispiel, wie man URLs umschreibt: www.example.com/index.php?id=1&cat=3 zu www.example.com/1/3/ (oder was auch immer). Ich weiß das.

Was ich nicht weiß, ist, wie ich meine gesamten Links auf allen Seiten so ändern kann, dass sie auf schöne URLs verweisen. Alle Links auf meiner Website sind altmodisch ( <a href="index.php?id=1&cat=2"> ) und davon gibt es viele.

Ich frage, ob jemand eine Idee hat oder weiß, wie man automatisch auf diese hübsche URL umleitet, wenn der Benutzer auf index.php?id=1 klickt (fast wie diese Website Stackoverflow, wenn Sie den Titel in der URL ändern).

Meine Vermutungen sind also...

  1. Verwenden Sie .htaccess, um die index.php?id=1&cat=2 zu lesen, um index/1/3 umzuschreiben, das selbst wieder interpretiert (seltsam)

  2. eine php-Datei, die die Umleitungen vornimmt, die htaccess wieder in das Original zurückschreibt...

Schlussfolgerung: Veränderung <a href="index.php?id=1&....."> automatisch zu index/1/2


GELÖST

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

##################################
# This turns index.php?id=1&cat=2 into index/1/2 and then back 'transparent' into    index.php?id=1&cat=2 if you have old fashioned
# links in your site and don't want to change them :)

# Avoid mod_rewrite infinite loops 
# This is critical if you want to use this code

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
#   and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index.php$ http://localhost/index/%1/%2/? [L,R]

# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
# Won't re-trigger the above rewrite, though I'm
#   not really sure why! The order of the rules
#   doesn't seem to make a difference.
RewriteRule ^index/(\d+)/(\d+)/$ index.php?id=$1&cat=$2 [L]

3voto

Lightness Races in Orbit Punkte 367630
RewriteEngine on

# Prevents browser looping, which does seem
#   to occur in some specific scenarios. Can't
#   explain the mechanics of this problem in
#   detail, but there we go.
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
#   and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]

# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2

Im Idealfall würden Sie natürlich nur Ihre Links reparieren, und dann bräuchten Sie nur das Soft-Rewrite :)

Getestet mit Apache/2.2.3. Ich glaube, ich habe die Begriffe "hard-rewrite" und "soft-rewrite" erfunden.

0voto

whoughton Punkte 1385

Warum ändern Sie nicht einfach Ihre index.php-Datei, um dies zu tun? Sie könnten theoretisch ein wenig mehr Fehlerprüfung auf diese Weise zu tun, so dass für die Variablen in beliebiger Reihenfolge sein und immer noch auf die richtige Endposition geroutet werden.

<?php
    // Permanent redirection
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://www.example.com/{$_GET['id']}/{$_GET['cat']}");

Ich habe hier keine Fehlerprüfung durchgeführt, sondern wollte ein Basisbeispiel geben.

Bei näherem Nachdenken vermute ich, dass es sich dabei um das Hinzufügen von Funktionen in die index.php-Datei handelt, die Sie dann für Ihre Anwendung selbst verwenden möchten, so dass es vielleicht dazu führen würde, die Funktionen im Code zu verwirren.

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