我正在尝试将旧的API端点移动到新的Restful(描述性)端点。我已经尝试使用以下nginx配置将旧请求重写到新端点,但是它不起作用。任何帮助将不胜感激。
server {
listen 80;
root /path/to/api/entry/file;
index index.php;
server_name api.example.com;
#Below not rewriting http://api.example.com/create/ to http://api.example.com/users/v1/create
rewrite ^/create/ /users/v1/create last;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_pass unix:/var/run/php5-fpm.sock;
access_log /var/log/nginx/example_api-access.log;
error_log /var/log/nginx/example_api-error.log;
fastcgi_read_timeout 600;
}
}
要达到的目的的一个示例是将http://api.example.com/create/重写为http://api.example.com/users/v1/create并将请求转发到入口脚本(index.php),它将引导必要的控制器来处理该请求
答案 0 :(得分:0)
您的rewrite...last
并没有取得任何成就,因为它是一个内部过程,最终以/index.php
结尾。您的index.php
脚本使用原始请求(可能来自REQUEST_URI参数)来确定API端点。
您需要使用rewrite...permanent
进行外部重定向,以使其对index.php
可见。有关详细信息,请参见this document。
例如:
rewrite ^/create/ /users/v1/create permanent;
或更有效地处理POST和GET请求:
location /create/ { return 307 /users/v1/create$is_args$args; }
如果您想在不进行重定向的情况下支持旧版API,则需要用专用的位置块来欺骗index.php
,例如:
location /create/ {
include fastcgi_params;
fastcgi_param REQUEST_URI /users/v1/create;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
您的许多fastcgi
伪指令可以移到外部块中,因此您无需两次编写它们。有关详细信息,请参见this document。