我希望能够为我们的用户(类似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;
}
答案 0 :(得分:0)
您的无扩展名脚本和个人网址具有重叠的命名空间,因此您需要在将$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
在此配置和原始配置中都是多余的。