2016-07-12 9 views
1

Ich möchte in der Lage sein, "persönliche URL" für unsere Benutzer (Facebook wie), die natürlich eine dynamische Strings ist. Es muss in der Wurzel der Website sein, und deshalb habe ich große Kopfschmerzen damit.Nginx umschreiben, um eine "persönliche URL" zu erstellen

Die Anforderungen, die ich habe, sind:

1. I www.example.com/John.Doe müssen (es kann a-zA-Z0-9_- sein.)

und umschreiben zu:

www.example.com/profile?id=John.Doe

2. ich brauche auch die Website-Skripte Erweiterung auf weniger wie (was ich war in der Lage zu tun, mit t er große Leute hier mit "$ uri.php $ is_args $ query_string;"):

so www.example.com/login gehen an: www.example.com/login.php

Ich habe viele Dinge ausprobiert, aber ich kann einfach nicht die richtige Formel finden, damit es funktioniert. Dies ist meine Konfiguration, gerade jetzt:

location/{ 
    try_files $uri $uri/ $uri.php$is_args$query_string; 
} 

location ~ \.php$ { 
    if ($request_uri ~ ^/([^?]*)\.php(\?.*)?$) { 
     return 301 /$1$2; 
    } 
    try_files $uri =404; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

Antwort

0

Sie haben einen überlappenden Namespace für Ihre Erweiterung lose Skripte und Ihre persönlichen URLs, so müssen Sie für die Anwesenheit der $uri.php Datei testen, bevor es profile.php neu zu schreiben.

Anstatt den URI in der ersten try_files Direktive (wie Sie es jetzt haben) neu zu schreiben, kann es besser sein, einen benannten Standortblock zu verwenden, um die PHP-Datei zu verarbeiten, ohne sie zuerst neu schreiben zu müssen.

So:

location/{ 
    try_files $uri $uri/ @php; 
} 

location @php { 
    try_files $uri.php @rewrite; 

    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

location @rewrite { 
    rewrite ^/([a-zA-Z0-9_.-]+)$ /profile.php?id=$1 last; 
} 

location ~ \.php$ { 
    if ($request_uri ...) { ... } 

    try_files $uri =404; 
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass 127.0.0.1:9001; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
} 

Der erste Block dient statische Dateien. Der zweite Block verarbeitet erweiterungslose PHP-Dateien (wenn und nur wenn sie existieren). Der dritte Block führt eine Umschreibung auf profile.php durch (die nicht erweiterungsfrei sein muss, da sie dem Client nicht zur Verfügung steht). Der vierte Block verarbeitet normale .php URIs und enthält Ihren $request_uri Fix.

Beachten Sie, dass fastcgi_index in dieser und der ursprünglichen Konfiguration redundant ist.

Weitere Einzelheiten sind hier einige Links zu der nginx Dokumentation für die location, try_files und rewrite Richtlinien.

+0

Vielen Dank !, hat super funktioniert. Ich kann nicht abstimmen, da ich neu hier bin. – Trocker

+0

Willkommen bei SO :-) Ich habe auch einige Referenzen zu meiner Antwort hinzugefügt. –