Nginx переписать, чтобы сделать "личный URL"

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

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

1. Мне нужно www.example.com/John.Doe (это может быть a-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;
}

1 ответ

Решение

У вас есть перекрывающееся пространство имен для ваших сценариев без расширения и ваших личных 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 документация для местоположения, директивы try_files и rewrite.

Другие вопросы по тегам