我有以下重写位置:
location ~ ^/payment/gateway/v2/order/complete/(.*)$ {
proxy_pass http://api.test.com:8080/payment/gateway/v2/order/complete?order_id=$1;
}
然后我尝试了这个:
location /payment/gateway/v2/order/complete {
rewrite ^/payment/gateway/v2/order/complete/(.+) /payment/gateway/v2/order/complete?order_id=$1 break;
proxy_pass http://api.test.com:8080
}
那么这个:
location /payment/gateway/v2/order/complete/ {
rewrite ^/payment/gateway/v2/order/complete/$ /payment/gateway/v2/order/complete?order_id=$1 last;
proxy_pass http://api.test.com:8080
}
那么这个:
location /payment/gateway/v2/order/complete {
rewrite ^/payment/gateway/v2/order/complete/([^/]+)$ /payment/gateway/v2/order/complete?order_id=$1 last;
proxy_pass http://api.test.com:8080;
}
所有这些都不起作用。
编辑:这是完整的 nginx 配置:
server {
listen 443 ssl;
server_name api.test.com www.api.test.com;
ssl_certificate /home/ssl/api.test.com/cert.pem;
ssl_certificate_key /home/ssl/api.test.com/key.pem;
ssl_protocols SSLv3 TLSv1.2;
ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800';
access_log /var/log/nginx/api.test.access.log;
error_log /var/log/nginx/api.test.error.log;
root /home/test;
include /etc/nginx/conf/wellknown.conf;
location /payment/paypal {
proxy_pass http://api.test.com:8080;
}
location /payment/visa {
proxy_pass http://api.test.com:8080;
}
location /payment/gateway {
proxy_pass http://api.test.com:8080;
}
location /payment/gateway/order/complete {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api.test.com:8080;
}
location /payment/gateway/v2/order/complete {
rewrite ^/payment/gateway/v2/order/complete/(.+) /payment/gateway/v2/order/complete?order_id=$1 break;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api.test.com:8080;
}
location /payment/mastercard/order {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api.test.com:8080;
}
location /payment/mir/order {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api.test.com:8080;
}
location /payment/v1 {
proxy_pass http://api.test.com:8080;
}
location /catalog {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:9202;
}
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Locale';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
}
location /test-rpc {
proxy_pass http://api.test.com:8080;
}
}
EDIT2:这里 wellknown.conf 配置文件正文:
location ^~ /.well-known/ {
default_type "text/plain";
allow all;
}
EDIT3我优化了位置,但不影响最终结果:
server {
listen 443 ssl;
server_name api.test.com www.api.test.com;
ssl_certificate /home/ssl/api.test.com/cert.pem;
ssl_certificate_key /home/ssl/api.test.com/key.pem;
ssl_protocols SSLv3 TLSv1.2;
ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800';
access_log /var/log/nginx/api.test.access.log;
error_log /var/log/nginx/api.test.error.log;
root /home/test;
include /etc/nginx/conf/wellknown.conf;
location /payment/gateway/v2/order/complete {
rewrite ^/payment/gateway/v2/order/complete/(.+) /payment/gateway/v2/order/complete?order_id=$1 break;
proxy_pass http://api.test.com:8085;
}
location /payment {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://api.test.com:8085;
}
location /catalog {
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:9202;
}
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Locale';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'Authorization,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
}
}
location /test-rpc {
proxy_pass http://api.test.com:8080;
}
}
Nginx 版本 1.13.8
提前致谢
那这个呢?
请注意,我已删除结束字符串 char
$
并添加了一个可选的尾部斜杠/?
。我还更改了重定向标志last
以break
防止重定向循环。最后,?
目标 URL 中的尾随阻止 nginx 添加之前的请求参数(如果有的话)。该正则表达式匹配如下字符串:在所有这些情况下,
$1
将是123123
并且重定向目标是/payment/gateway/v2/order/complete/?order_id=123123
您可以使用 curl 测试重定向:
你应该得到回应
Location: https://yoursite/payment/gateway/v2/order/complete/?order_id=123123
文档: http: //nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
这应该可以在不使用 rewrite 命令的情况下完成。
在此示例中,我们使用不区分大小写的正则表达式 (
~*
) 来捕获complete
URL 中的所有内容,然后在该位置内使用 $1 重建请求。为了测试设置,我在我的 nginx 中添加了一个配置:
这被配置为成功命中将被代理到其他服务器并返回 202,任何不成功的命中将导致 40x 响应。
这可以使用 curl 从“客户端”进行测试,如下所示:
查看日志,我们观察到两个条目:
这也可以稍微清理一下,以仅使用更复杂的正则表达式匹配包含有效 ID 的请求。Nginx 支持完整的 PCRE 匹配/设置表达式。
来源:https ://nginx.org/en/docs/http/ngx_http_core_module.html#location