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.