Nginx 重写 "personal URL"

Nginx rewrite to make a "personal URL"

我希望能够为我们的用户(Facebook 之类)制作 "personal 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 /;
    }
    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.[=20 之前测试是否存在 $uri.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= 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 在此配置和原始配置中都是多余的。

有关更多详细信息,这里有一些指向 location, try_files and rewrite 指令的 nginx 文档的链接。