Nginx 将位置重写到新 API 个端点

Nginx ReWrite location to New API endpoints

我正在尝试将旧的 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/ to http://api.example.com/users/v1/create 并将请求转发到入口脚本 (index.php),它将 bootstrap 必要的控制器来处理请求

您的 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