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。
我正在尝试将旧的 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。