我希望能够为我们的用户(像Facebook一样)制作"个人URL",这当然是一个动态字符串。 它需要位于网站的根目录中,这就是为什么我对它感到头疼的原因。
我的要求是:
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;
}
您的无扩展脚本和个人 URL 有一个重叠的命名空间,因此您需要在将 $uri.php
文件重写为 profile.php
之前测试该文件是否存在。
因此,与其在第一个 try_files
指令中重写 URI(就像现在这样),不如使用命名位置块来处理 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
在此配置和原始配置中都是多余的。
有关更多详细信息,以下是指向位置、try_files和重写指令的nginx
文档的一些链接。