我想写一个诸如 mysite.com/l360/profile/55 之类的 URL,然后让 NGINX 加载 mysite.com/l360/home.php?path=profile/55。
不幸的是,这次我不能直接切换到 apache2。所以我必须找到一种方法让 NGINX 正常工作。
我现在的问题是 mysite.com/l360 加载 home.php 并且 mysite.com/l360/home.php 正常工作。当我尝试执行 mysite.com/l360/profile 时,它会尝试从服务器下载 BIN 文件。
以下是该部分的配置:
location / {
try_files $uri $uri/ $uri.html $uri.php?$query_string;
client_max_body_size 50M;
client_body_buffer_size 128k;
}
location /l360 {
try_files $uri $uri/ @l360rw;
}
location @l360rw {
return 302 /home.php?path=$uri;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
fastcgi_index home.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include fastcgi_params;
}
答案1
我会尝试使用捕获组的正则表达式和重写语句. 类似这样
location ^/l360/profile/([0-9]+)$ {
rewrite /l360/home.php?path=profile/$1
}
location ~ \.php$ {
try_files $uri =404;
// I removed the next line mostly because my config doesn't have it
// REMOVED fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
fastcgi_index home.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include fastcgi_params;
}
我还没有测试过,如果它能像写的那样工作,我会很惊讶。不过它应该能给你一些关于如何做到这一点的线索。
毫无疑问,还有其他方法可以做到这一点,其他人可能会给出更好的答案,或者可能有助于完善我的答案以使其正常工作。
答案2
我找到了一个可行的解决方案,只需要我稍微修改一下代码。以下内容将给出 path=l360/test/ 的参数,因此所需的只是一种方法来从路径名中删除文件的主目录:
location /l360 {
index home.php;
try_files /$uri /$uri/ /l360/home.php?path=$uri;
}
location / {
try_files $uri $uri/ $uri.html $uri.php?$query_string;
client_max_body_size 50M;
client_body_buffer_size 128k;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
fastcgi_index home.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
include fastcgi_params;
}