Nginx重新写入新API端点的位置

时间:2018-12-10 05:46:23

标签: nginx nginx-config

我正在尝试将旧的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),它将引导必要的控制器来处理该请求

1 个答案:

答案 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