2016-07-12 5 views
1

Я хотел бы иметь возможность сделать «персональный URL» для наших пользователей (например, Facebook), что, конечно же, динамические строки. он должен быть в корне сайта, и именно поэтому у меня с ним большая головная боль.Nginx переписать, чтобы сделать «личный URL»

Требования, которые у меня есть следующие:

1. мне нужно www.example.com/John.Doe (это может быть-Za-Z0-9_-.)

и переписать его:

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

2. мне нужны скрипты сайта, чтобы быть продолжением менее, как (я был в состоянии сделать, с т он великий народ здесь, используя "$ uri.php $ is_args $ query_string;"):

так www.example.com/login пропадут: www.example.com/login.php

Я пробовал много вещей, но я просто не могу получить правильную формулу, чтобы заставить ее работать. Это моя конфигурация, прямо сейчас:

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; 
} 

ответ

0

Вы перекрывающееся пространство имен для ваших расширения меньше скриптов и ваших личных URL-адресов, так что вы должны проверить наличие файла $uri.php, прежде чем переписывать его profile.php.

Поэтому вместо того, чтобы переписывать URI в первой директиве try_files (как у вас есть сейчас), может быть лучше использовать именованный блок местоположения для обработки файла PHP, не переписывая его в первую очередь.

Как это:

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; 
} 

Первый блок обслуживает статические файлы. Второй блок обрабатывает файлы PHP без расширения (если и только они существуют). Третий блок выполняет переписывание до profile.php (который не требует расширения, поскольку он не подвергается клиенту). Четвертый блок обрабатывает нормальные .php URI и включает в себя исправление $request_uri.

Обратите внимание, что fastcgi_index является избыточным как в этой, так и в первоначальной конфигурации.

Для получения более подробной информации, обратитесь к документации nginx для директив location, try_files и rewrite.

+0

Большое спасибо !, работал отлично. Я не могу проголосовать, поскольку я здесь новый. – Trocker

+0

Добро пожаловать в SO :-) Я также добавил несколько ссылок на мой ответ. –