我尝试使用Thin应用服务器并遇到一个问题。
当nginx proxies使用proxy_pass http://my_app_upstream;
对Thin(或Unicorn)的请求时,应用程序会收到nginx(http://my_app_upstream
)发送的修改后的URL。
我想要的是从客户端传递原始URL和原始请求而不进行任何修改,因为应用程序非常依赖它。
nginx'doc说:
如果需要传输URI 未处理的表格然后指令 应该在没有URI的情况下使用proxy_pass 一部分。
但我不明白如何配置,因为相关示例实际上使用的是URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
那么请你帮我弄清楚如何从客户端保留原始请求网址?
答案 0 :(得分:104)
我认为proxy_set_header
指令可以提供帮助:
location / {
proxy_pass http://my_app_upstream;
proxy_set_header Host $host;
# ...
}
答案 1 :(得分:10)
只需 proxy_set_header主机$ host 我的案子错过了港口。解决方法:
location / {
proxy_pass http://BACKENDIP/;
include /etc/nginx/proxy.conf;
}
然后在proxy.conf
中
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
答案 2 :(得分:3)
完全转发,而不会切断请求的absoluteURI
和标题中的Host
:
server {
listen 35005;
location / {
rewrite ^(.*)$ "://$http_host$uri$is_args$args";
rewrite ^(.*)$ "http$uri$is_args$args" break;
proxy_set_header Host $host;
proxy_pass https://deploy.org.local:35005;
}
}
在此处找到:https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/
答案 3 :(得分:3)
nginx还提供了$ http_host变量,它将为您传递端口。 它是主机和端口的串联。
所以你只需要这样做:
export const Hover = ({ onHover, children }) => (
<div className="hover">
<div className="hover__no-hover">{children}</div>
<div className="hover__hover">{onHover}</div>
</div>
)
const App = () => (
<div style={styles}>
<Hover onHover={<div> Show this on hover </div>}>
<div> Show on no hover </div>
</Hover>
</div>
);
答案 4 :(得分:1)
在我的场景中,我通过nginx vhost配置中的以下代码进行了此操作
server {
server_name dashboards.etilize.com;
location / {
proxy_pass http://demo.etilize.com/dashboards/;
proxy_set_header Host $http_host;
}}
$ http_host将在Header中设置与请求相同的URL
答案 5 :(得分:1)
例如,如果某些内容修改了您要服务的位置,例如try_files
,这将保留对后端的请求:
location / {
proxy_pass http://127.0.0.1:8080$request_uri;
}
答案 6 :(得分:0)
请其他人注意以下事项:解决方案的核心 nginx不操纵URL,是在末尾删除斜杠 复制:proxy_pass指令。 http://my_app_upstream与 http://my_app_upstream/ –雨果·约瑟夫森
我在上面的评论中发现了这一点,但我认为这确实应该是一个答案。
答案 7 :(得分:-1)
对于我的身份验证服务器...有效。我想为自己的人性化可读性提供/ auth选项...或者也可以通过端口/上游将其配置为机器对机器。
####################################################
upstream auth {
server 127.0.0.1:9011 weight=1 fail_timeout=300s;
keepalive 16;
}
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
location /auth {
proxy_pass http://$http_host:9011;
proxy_set_header Origin http://$host;
proxy_set_header Host $http_host:9011;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}
#####################################################################
# #
# Proxies for all the Other servers on other ports upstream #
# #
#####################################################################
#######################
# Fusion #
#######################
server {
listen 9001 ssl;
############# Lock it down ################
# SSL certificate locations
ssl_certificate /etc/letsencrypt/live/allineed.app/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/allineed.app/privkey.pem;
# Exclusions
include snippets/exclusions.conf;
# Security
include snippets/security.conf;
include snippets/ssl.conf;
# Fastcgi cache rules
include snippets/fastcgi-cache.conf;
include snippets/limits.conf;
include snippets/nginx-cloudflare.conf;
########### Location upstream ##############
location ~ / {
proxy_pass http://auth;
proxy_set_header Origin http://$host;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
}