Accept头或URL中的nginx和API版本控制

时间:2014-08-08 10:04:20

标签: nginx

所以我决定做两种错误,略微受到Troy Hunt的启发。

我希望我的API可以通过Accept标头接受版本规范,但也可以在网址中接受,例如: /v1

目前,我已经制作了一个与Accept标题一起使用的nginx配置,但尝试了各种方法,我无法获得/v1

我想要实现的是传递给我的应用程序的URL,不包括版本部分,因为版本的角色只是指向root目录。

map $http_accept $api_version {
    default 0;
    "application/vnd.it.echo.api+json; version=1" "v1";
}

server {
    listen 80;
    server_name api.app;

    index index.html index.htm index.php;

    charset utf-8;

    sendfile off;

rewrite_log on;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    location / {
        if ($api_version = 0) {
            return 307 https://echo.it;
        }
        try_files $uri $uri/ @api;
    }

    location /v1 {
        set $api_version "v1";
        rewrite ^/.+/(.+)$ /$1 last;
    }

    location @api {
        root       /home/vagrant/api/$api_version/public/;
        error_log  /var/log/nginx/api.$api_version.app-error.log error;
        try_files  $uri $uri/ /index.php?$query_string;
    }

    error_page 404 /index.php;

    location ~ \.php$ {
        root /home/vagrant/api/$api_version/public/;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

问题似乎是rewrite位置指令中的/v1规则未生效。

0 个答案:

没有答案