我的服务器绑定了几个域名。
我需要将类似domain.com
或的请求重定向domain.com/
到app.domain.com
。
以下是我在应用程序配置中添加的内容:
server {
listen 80;
server_name main_domain.com domain.com;
... other lengthy directives ...
location = / {
if ($host ~ 'domain.com') {
return 302, http://app.domain.com;
}
}
location / {
try_fies $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:path_to/uwsgi.sock;
uwsgi_intercept_errors on;
}
}
这使得重定向有效,但对/
我的其他域名的请求全部返回 404。
我该怎么做才能让 Nginx 运行到匹配的位置?
答案1
如果我正确理解了这个问题,那么目标是:
http://domain.com/
-> 302 ->http://app.domain.com/
http://app.domain.com/
-> @app 响应的静态文件http://main_domain.com/
-> @app 响应的静态文件http://domain.com/something
-> @app 响应的静态文件http://app.domain.com/something
-> @app 响应的静态文件http://main_domain.com/something
-> @app 响应的静态文件
(不确定为什么在配置中使用 main_domain 和 domain ;但问题中使用了 domain 和 app.domain - 如果您使用通配符 dns,则您当前依赖于隐式default_server
)。
假设这是正确的:使用两个服务器块。
例如将所有这些放在一个文件中:
# /etc/nginx/common.conf
... other lengthy directives ...
location / {
try_fies $uri @app;
}
location @app {
include uwsgi_params;
uwsgi_pass unix:path_to/uwsgi.sock;
uwsgi_intercept_errors on;
}
并将其包含在两个服务器块中:
server {
listen 80;
server_name domain.com;
location = / {
return 302 http://app.domain.com;
}
include common.conf;
}
server {
listen 80;
server_name main_domain.com app.domain.com;
include common.conf;
}
这样就避免了使用 if 测试主机名,并且可以更清楚地了解每个主机将要发生什么。
答案2
如果我是你,我会稍微修改一下配置,以返回请求的 URI,但是在你想要重定向到的子域上,通过使用重写规则来执行此操作(你已经快到了);
server {
listen 80;
server_name main_domain.com domain.com;
if ( $host = 'domain.com' ) {
rewrite ^ http://app.domain.com$request_uri? permanent;
}
}
请注意,我已将其从您的location
指令中删除(因此它适用于所有传入的 URI 请求)。
编辑:还请注意,我只是在假设您可能只想重写特定的 URL 的情况下留下了该if
声明 - 如果不是这种情况,请将其放在rewrite
这些服务器名称的配置主体中。