我使用nginx作为几个tomcats前面的负载balencer.在我的传入请求中,我编码了查询参数.但是当请求到达tomcat时,参数被解码:
传入nginx的请求:
curl -i "http://server/1.1/json/T;cID=1234;pID=1200;rF=http%3A%2F%2Fwww.google.com%2F"
Run Code Online (Sandbox Code Playgroud)
传入tomcat的请求:
curl -i "http://server/1.1/json/T;cID=1234;pID=1200;rF=http:/www.google.com/"
Run Code Online (Sandbox Code Playgroud)
我不希望我的请求参数被转换,因为在那种情况下我的tomcat会抛出405错误.
我的nginx配置如下:
upstream tracking {
server front-01.server.com:8080;
server front-02.server.com:8080;
server front-03.server.com:8080;
server front-04.server.com:8080;
}
server {
listen 80;
server_name tracking.server.com;
access_log /var/log/nginx/tracking-access.log;
error_log /var/log/nginx/tracking-error.log;
location / {
proxy_pass http://tracking/webapp;
}
}
Run Code Online (Sandbox Code Playgroud)
在我当前的apache负载均衡器配置中,我有AllowEncodedSlashes指令来保留我的编码参数:
AllowEncodedSlashes NoDecode
Run Code Online (Sandbox Code Playgroud)
我需要从apache转移到nginx.
我的问题与这个问题完全相反:避免nginx在proxy_pass上转义查询参数
假设我想在URL中编码文章标题并包含斜杠.如果我对文章标题进行URL编码,我得到:
http://example.com/articles/foo%2fbar/view/
Run Code Online (Sandbox Code Playgroud)
NGINX将此传递给我的FastCGI应用程序,如下所示:
http://example.com/articles/foo/bar/view/
Run Code Online (Sandbox Code Playgroud)
这相当破坏了这个想法.
我注意到如果NGINX正在提供文件,比如/path/to/page.html,那么可以通过以下两个URL之一访问它:
http://example.com/path/to/page.html
http://example.com/path/to%2fpage.html
Run Code Online (Sandbox Code Playgroud)
但是(例如)Apache不是这种情况.
有没有办法解决这个问题?
我试过文档和谷歌没有运气.
谢谢.
UPDATE
nginx配置:
worker_processes 1;
pid ./nginx.pid;
events {
worker_connections 1024;
}
http {
server_tokens off;
server {
listen 80;
server_name localhost;
location /mysite/{
fastcgi_pass unix: ./mysite.fcgi.socket;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param SCRIPT_NAME "/mysite/";
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试配置我的Nginx以www.从主机名中删除.我正在寻找处理可能的子域案例的通用规则.
例如,如果http://www.foo1.sample.com并且http://www.fooX2.sample.com是两个域.
然后我想www.在这些子域之前删除任何子域,并将它们分别重定向到(http://foo1.sample.com并且http://fooX2.sample.com不知道规则中的确切子域.)
谢谢.
原始网址:/ api/url%2已编码%2F /?with = queryParams
nginx的:
location /api {
client_max_body_size 2G;
proxy_pass https://oursite;
}
Run Code Online (Sandbox Code Playgroud)
使用此配置,我可以在通过代理时保留URL编码.如果我在"ourite"之后添加"/",它将解码URL.
问题:
现在代理后的URL仍然包含"/ api /".我只需要在保留URL编码部分的同时删除"/ api /".
似乎 Nginx 在与正则表达式一起使用时总是对 url 进行解编码。我有一个重写规则:
location /api/ {
rewrite /api/(.*)$ $1 break;
proxy_pass http://127.0.0.1:8000/$1;
}
Run Code Online (Sandbox Code Playgroud)
我想从 usl 中删除 api 但保留路径的其余部分。路径的一部分是电子邮件地址 someone@somewhere.com。我正在通过某人 %40somewhere.com 但 Nginx 正在用 @ 符号将它转回来。
我正在尝试使用nginx通过HTTPS/SSL访问RabbitMQ接口,我无法弄清楚我缺少什么.
这是我的rabbitmq.conf文件:
[
{ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
{rabbit, [
{reverse_dns_lookups, true},
{hipe_compile, true},
{tcp_listeners, [5672]},
{ssl_listeners, [5671]},
{ssl_options, [
{cacertfile, "/etc/ssl/certs/CA.pem"},
{certfile, "/etc/nginx/ssl/my_domain.crt"},
{keyfile, "/etc/nginx/ssl/my_domain.key"},
{versions, ['tlsv1.2', 'tlsv1.1']}
]}
]
},
{rabbitmq_management, [
{listener, [
{port, 15671},
{ssl, true},
{ssl_opts, [
{cacertfile, "/etc/ssl/certs/CA.pem"},
{certfile, "/etc/nginx/ssl/my_domain.crt"},
{keyfile, "/etc/nginx/ssl/my_domain.key"},
{versions, ['tlsv1.2', 'tlsv1.1']}
]}
]}
]}
].
Run Code Online (Sandbox Code Playgroud)
当我重新启动rabbitmq-server时,一切正常
我的nginx文件如下所示:
location /rabbitmq/ {
if ($request_uri ~* "/rabbitmq/(.*)") {
proxy_pass https://example.com:15671/$1;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我猜测ngnix配置无法解析HTTPS URL,因为我在尝试浏览时遇到504超时错误:
https://example.com/rabbitmq/
Run Code Online (Sandbox Code Playgroud)
显然,这不是正确的FQDN,但SSL证书在没有/ rabbitmq /的情况下工作正常
有没有人能够通过FQDN和HTTPS在外部连接上使用RabbitMQ管理Web界面?
我是否需要在专用于15671端口的nginx配置中创建新的"服务器"块?
任何帮助将非常感激!