2017-04-01 7 views
0

Ich implementiere eine grundlegende URL-Rewriting in einer PHP-Anwendung. Unten ist die Vorgehensweise, die ich befolge:Benutzerdefinierte URL-Rewriting in PHP

table 1: rewrite_table (fields as below) 

id | original_url | custom_url 

Diese Tabelle verwende ich, um ursprüngliche URL und benutzerdefinierte URL zu speichern.

Ich bin Überprüfung beim Start, ob die angeforderte URL mit jedem CUSTOM_URL abgestimmt ist und wenn ja, dann rufe ich Controller und die Aktion, die in original_url Feld

gespeichert wird, die fein arbeitet. Nun, Punkt ist, wenn ich die benutzerdefinierte URL wieder ändere, dann möchte ich die alte URL in einer URL-Log-Tabelle behalten und für den Fall, dass jeder Benutzer die Webseite mit dieser alten URL durchsucht, wird er auf die neue URL mit 301 Redirect umgeleitet .

Ich habe eine neue Tabelle erstellt, wie

Table2: rewrite_table (fields as below) 

log_original_url | current_url_id (this belongs to first table id filed) 

Diese Tabelle I alte URL speichern bin mit, die für alle öffentlich zugänglichen ist, bevor die URL erneut zu aktualisieren, die bereits im ersten Tisch.

Ich bin verwirrend und nicht in der Lage, eine Lösung zu finden, um den zweiten Ansatz zu implementieren.

Wer kann mir helfen, eine Lösung zu finden

Dank

+0

Gibt es einen Grund dafür, anstatt nur .htaccess zu verwenden? (Oder web.config, wenn Sie auf IIS sind) – John

+0

Ja John, manchmal müssen wir benutzerdefinierte URLs nach dem Zufallsprinzip hinzufügen und loszuwerden Regel in Htaccess jedes Mal hinzufügen Bedingung –

Antwort

0

Ihre Frage, so scheint es, dass Sie original_url in allen Fällen verwenden.

Mein Ansatz dafür wird sein.

wählen T1.original_url von rewritetable1 T1 links rewritetable2 T2 Join auf T2.current_url_id = T1.id wo T1.custom_url = 'Benutzereingabe url' OR T2.log_original_url = 'url Benutzereingabe'

Also, wenn Benutzer die alte benutzerdefinierte URL oder neue benutzerdefinierte URL eingeben, u wird immer original_url, die Sie gonna

+0

Dank Mohana, aber ich habe schon versucht, diesen Ansatz . Denken Sie an, wenn es doppelt Eintrag in Protokolltabelle OR Datensatz nicht in der ersten Tabelle übereinstimmen dann müssen wir in der zweiten Tabelle separat suchen, um zu bestätigen, gibt es eine alte URL für die Anfrage und wenn ja, dann müssen wir Finden Sie die ursprüngliche URL basierend auf der ID gespeichert in Protokolltabelle 2 Hier wird ein weiterer Fall generiert, wenn doppelte Eintrag in der Protokolltabelle. Dann werden die ersten übereinstimmenden Datensätze abgerufen und die jeweilige ursprüngliche URL zurückgegeben. –

+0

Ich denke, beim Speichern benutzerdefinierte URL müssen Sie eine neue Zeile in Table2 einfügen, die original_url_id mit old_custom_url.Abbildet Sie jetzt original_url selbst anstelle von benutzerdefinierten URL speichern. Wenn Änderung beim Speichern entsprechend meine bearbeitete Antwort könnte funktionieren – MohanaPriyan

0

diese Umleitung werden versuchen:

Tabelle 1: Urls (internal_url ist eindeutig)

id | internal_url | current_alias_id


1 | Benutzer/Index | 3

2 | Benutzer/Ansicht | 4

Tabelle 2: Aliase (alias ist einzigartig)

id | internal_url_id | alias


1 | 1 |/my/custom/index/url/1

2 | 1 |/my/custom/index/url/2

3 | 1 |/my/custom/index/url/3

4 | 2 |/my/custom/view/url/1

Die obigen Beispiele veranschaulichen eine Situation, in der jede interne URL (in Ihrer Terminologie "Original") einen oder mehrere Aliase haben kann. Einer dieser Aliase ist immer "aktuell" oder "kanonisch". Wenn es besucht wird, muss es in die entsprechende interne URL neu geschrieben werden, ohne dass eine Umleitung stattfindet. Die interne URL zeigt immer über das Feld "current_alias_id" auf ihren kanonischen Alias. Die anderen Aliasnamen müssen beim Besuch auf den "kanonischen" Alias ​​derselben internen URL umgeleitet werden.

In den Beispielen hat die interne URL "user/index" 3 Aliase und ihr aktueller (kanonischer) Alias ​​ist # 3, während die anderen 2 "alt" sind.

Die interne URL "user/view" hat nur einen Alias ​​# 4, der auch kanonisch ist.

record = SELECT a.*, 
     u.current_alias_id, u.internal_url 
     c.alias AS canonical_alias 
     FROM `aliases` a 
     INNER JOIN `urls` u ON a.original_url_id = u.id 
     INNER JOIN `aliases` c ON u.current_alias_id = c.id 
     WHERE a.alias = '$request_url'; 

// assume we found a record 
if (record.id == record.current_alias_id) 
    // rewrite to record.internal_url 
else 
    // redirect to record.canonical_alias 

Sollten Sie einen neuen Alias ​​hinzufügen müssen, beispielsweise auf interne URL # 2 (Benutzer /:

das erforderliche Verhalten, wenn ich Sie richtig verstehe, kann mit dem folgenden Pseudo-Code erreicht werden view) - fügen Sie es einfach zur aliases Tabelle hinzu, wo es id = 5, und dann UPDATE urls SET current_alias_id = 5 WHERE urls.id = 2

erhält Von nun an, wer auch immer den neuen Alias ​​besucht, wird die Anfrage direkt umgeschrieben, und wer auch immer den alten Alias ​​# 4, wird zu URL # 5 umgeleitet.

Natürlich sollten Sie sicherstellen, dass jede "interne URL" und jeder "Alias" eindeutig ist, indem Sie einen "eindeutigen" Index für die entsprechenden Spalten festlegen.

+0

Hallo Sergey, Danke für Ihre detaillierte Lösung. Ich möchte erwähnen, dass dieser Ansatz den Fall nicht behandelt, wenn ein Benutzer eine zwischengespeicherte/gespeicherte URL verwendet und das System bereits mit einer neuen Alias-URL aktualisiert wurde. Bitte korrigieren Sie mich, wenn ich irgendwo falsch liege. Vielen Dank für Ihre Bemühungen ... –

+0

Warum denkst du so? Dieser Algorithmus kann eine Anfrage nach einem Alias ​​erhalten, egal ob alt oder neu. Es wird immer zu dem Alias ​​umgeleitet, der in der Tabelle "urls" als "aktuell" markiert ist. Als Ergebnis wird der Cache des Benutzers aktualisiert, um auf die neue Weiterleitung zu zeigen. –

Verwandte Themen