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
文档的链接。
我希望能够为我们的用户(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
文档的链接。