Wie erstelle ich eine freundliche URL in PHP?


70

Normalerweise sieht die Praxis oder sehr alte Art der Anzeige einer Profilseite folgendermaßen aus:

www.domain.com/profile.php?u=12345

Wo u=12345ist die Benutzer-ID?

In den letzten Jahren habe ich eine Website mit sehr schönen URLs gefunden wie:

www.domain.com/profile/12345

Wie mache ich das in PHP?

Hat das etwas mit der .htaccessDatei zu tun ? Können Sie mir weitere Tipps oder einen Beispielcode zum Schreiben der .htaccessDatei geben?

Antworten:


51

Gemäß diesem Artikel möchten Sie eine mod_rewrite- .htaccessRegel (in einer Datei platziert), die ungefähr so ​​aussieht:

RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1

Und dies ordnet Anfragen von

/news.php?news_id=63

zu

/news/63.html

Eine andere Möglichkeit besteht darinforcetype , dies zu tun , wodurch alles auf einem bestimmten Pfad gezwungen wird, PHP zu verwenden, um den Inhalt zu bewerten. Fügen Sie also in Ihre .htaccessDatei Folgendes ein:

<Files news>
    ForceType application/x-httpd-php
</Files>

Und dann kann die index.php basierend auf der $_SERVER['PATH_INFO']Variablen Maßnahmen ergreifen :

<?php
    echo $_SERVER['PATH_INFO'];
    // outputs '/63.html'
?>

3
Eine großartige mod_rewrite-Ressource: addiertbytes.com/apache/mod_rewrite-cheat-sheet
James Socol

2
Eine andere Option, wenn Sie Ihre URL vollständig in PHP umschreiben möchten, besteht darin, Umschreiberegeln festzulegen, um alle Anforderungen an ein einziges Skript zu leiten. Ein großer Vorteil davon ist, dass Sie Ihren Code in einem Bereich speichern können, auf den Apache nicht zugreifen kann, und dass nur Ihr URL-Versandskript für Apache zugänglich sein muss. Beispiel: RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. dispatch.php Dies ähnelt Ihrem Forcetype-Beispiel.
Frank Farmer

2
Artikel über Phpriot wurde entfernt, lesen Sie ihn hier . Es ist ein sehr gutes Stück.
Jasom Dotnet

Wenn id = 1 und post_name = "red post", besteht die Möglichkeit, eine URL wie example.com/red-post.php zu erstellen. Derzeit erstelle ich eine URL wie example.com/post/?id=1. dh wie man Schnecke (URL) nach
Postname macht

Die von James Socolund geposteten Links Chad Birchsind defekt.
SebasSBM

31

Ich habe kürzlich Folgendes in einer Anwendung verwendet, die für meine Anforderungen gut funktioniert.

.htaccess

<IfModule mod_rewrite.c>
# enable rewrite engine
RewriteEngine On

# if requested url does not exist pass it as path info to index.php
RewriteRule ^$ index.php?/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [QSA,L]
</IfModule>

index.php

foreach (explode ("/", $_SERVER['REQUEST_URI']) as $part)
{
    // Figure out what you want to do with the URL parts.
}

15

Ich versuche dieses Problem Schritt für Schritt im folgenden Beispiel zu erklären.

0) Frage

Ich versuche dich so zu fragen:

Ich möchte eine Seite wie das Facebook-Profil www.facebook.com/kaila.piyush öffnen

Es erhält eine ID von der URL und analysiert sie in der Datei profile.php. Es gibt featch-Daten aus der Datenbank zurück und zeigt den Benutzer seinem Profil an

Wenn wir eine Website entwickeln, sieht der Link normalerweise wie folgt aus: www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

Jetzt aktualisieren wir mit neuem Stil und schreiben nicht neu. Wir verwenden www.website.com/username oder example.com/weblog/2000/11/23/5678 als Permalink

http://example.com/profile/userid (get a profile by the ID) 
http://example.com/profile/username (get a profile by the username) 
http://example.com/myprofile (get the profile of the currently logged-in user)

1) .htaccess

Erstellen Sie eine .htaccess-Datei im Stammordner oder aktualisieren Sie die vorhandene:

Options +FollowSymLinks
# Turn on the RewriteEngine
RewriteEngine On
#  Rules
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php

Was macht das?

Wenn es sich bei der Anforderung um ein echtes Verzeichnis oder eine Datei handelt (eine, die auf dem Server vorhanden ist), wird index.php nicht bereitgestellt, andernfalls wird jede URL zu index.php umgeleitet.

2) index.php

Jetzt möchten wir wissen, welche Aktion ausgelöst werden soll, und müssen daher die URL lesen:

In index.php:

// index.php    

// This is necessary when index.php is not in the root folder, but in some subfolder...
// We compare $requestURL and $scriptName to remove the inappropriate values
$requestURI = explode(‘/’, $_SERVER[‘REQUEST_URI’]);
$scriptName = explode(‘/’,$_SERVER[‘SCRIPT_NAME’]);

for ($i= 0; $i < sizeof($scriptName); $i++)
{
    if ($requestURI[$i] == $scriptName[$i])
    {
        unset($requestURI[$i]);
    }
}

$command = array_values($requestURI);
With the url http://example.com/profile/19837, $command would contain :

$command = array(
    [0] => 'profile',
    [1] => 19837,
    [2] => ,
)
Now, we have to dispatch the URLs. We add this in the index.php :

// index.php

require_once("profile.php"); // We need this file
switch($command[0])
{
    case ‘profile’ :
        // We run the profile function from the profile.php file.
        profile($command([1]);
        break;
    case ‘myprofile’ :
        // We run the myProfile function from the profile.php file.
        myProfile();
        break;
    default:
        // Wrong page ! You could also redirect to your custom 404 page.
        echo "404 Error : wrong page.";
        break;
}

2) profile.php

Jetzt in der Datei profile.php sollten wir ungefähr so ​​etwas haben:

// profile.php

function profile($chars)
{
    // We check if $chars is an Integer (ie. an ID) or a String (ie. a potential username)

    if (is_int($chars)) {
        $id = $chars;
        // Do the SQL to get the $user from his ID
        // ........
    } else {
        $username = mysqli_real_escape_string($char);
        // Do the SQL to get the $user from his username
        // ...........
    }

    // Render your view with the $user variable
    // .........
}

function myProfile()
{
    // Get the currently logged-in user ID from the session :
    $id = ....

    // Run the above function :
    profile($id);
}

danke für den ausführlichen Beitrag, ich wollte immer erfahren, wie Websites wie WordPress hübsche URLs generieren und auf sie zugreifen können, ohne jedes Mal die htaccess-Datei zu bearbeiten, danke

Das ist genau das, wonach ich gesucht habe.
Alejandro Cumpa

Wie gehst du mit #anchors um?
JG Estiot


4

Es ist eigentlich kein PHP, es ist Apache mit mod_rewrite. Was passiert, ist, dass die Person den Link www.example.com/profile/12345 anfordert und Apache ihn dann mithilfe einer Umschreiberegel zerlegt, sodass er wie folgt aussieht: www.example.com/profile.php?u=12345 Server. Weitere Informationen finden Sie hier: Rewrite Guide


-1

ModRewrite ist nicht die einzige Antwort. Sie können auch Optionen + MultiViews in .htaccess verwenden und dann überprüfen $_SERVER REQUEST_URI, ob alles in der URL enthalten ist.


Ja, aber MultiViews ist schwierig ... Ich würde sagen, es ist zu allgemein für diese Verwendung.
David Z

-1

Es gibt viele verschiedene Möglichkeiten, dies zu tun. Eine Möglichkeit besteht darin, die zuvor erwähnten RewriteRule-Techniken zu verwenden, um Abfragezeichenfolgenwerte zu maskieren.

Wenn Sie das Front-Controller- Muster verwenden, können Sie auch URLs wie http://yoursite.com/index.php/path/to/your/page/here verwenden und den Wert von $ _SERVER analysieren ['REQUEST_URI'].

Sie können das Bit / path / to / your / page / here einfach mit dem folgenden Codebit extrahieren:

$route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));

Von dort aus können Sie es nach Belieben analysieren, aber um Himmels willen stellen Sie sicher, dass Sie es desinfizieren;)


-2

Es sieht so aus, als würden Sie von einem RESTful-Webservice sprechen.

http://en.wikipedia.org/wiki/Representational_State_Transfer

Die .htaccess-Datei schreibt alle URIs neu, um auf einen Controller zu verweisen. Dies ist jedoch detaillierter, als Sie an dieser Stelle erhalten möchten. Vielleicht möchten Sie sich Recess ansehen

Es ist ein RESTful-Framework in PHP


2
Technisch gesehen haben Sie wahrscheinlich Recht, aber wenn das OP nicht bereits mit der REST-Idee vertraut ist, ist das Lesen dieses Wikipedia-Artikels weitaus aufwändiger als das Problem erfordert. Das Aufrufen eines ganzen Programmierparadigmas ist für diese Situation übertrieben.
David Z

1
"Ja wirklich?" Ich glaube nicht, dass seine Fragen genau "Wie mache ich profile.php? U = 12345 goto / profile / 12345" lauteten. Ich interpretierte dies als "Wie wird das in Produktionsumgebungen gemacht?". Ich denke, es ist von Vorteil zu wissen, dass es da draußen ein Paradigma gibt und keine .htaccess-Datei voller Weiterleitungen, wenn es einen geeigneten Weg gibt, um dieses Problem anzugehen.
Ryanday
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.