我有两个申请。
- Laravel 应用程序- 只是一个动态网站。没有数据知识。所有数据都使用 AJAX 请求从第二个应用程序获取。运行于
127.0.0.1:8000
。 - Rust 应用- 包含所有业务逻辑和数据访问的 Web 应用程序。运行于
127.0.0.1:8080
。
两个应用程序都需要从 URL 访问example.com
。为此,我想使用 Nginx 反向代理。我已经能够将所有请求重新路由到我的 Laravel 应用程序。
events {}
http {
server {
listen 80;
# Website
location / {
proxy_pass http://127.0.0.1:8000;
}
}
}
当 Laravel 应用程序运行时,我实际上需要以下 Nginx 配置:
- 特定页面如
/news
、/
、/about
、/contact
...... 应重定向至127.0.0.1:8000
。 - 注意:上面的页面可以包含 GET 参数,例如
/news?article=abc
。 - 所有其他请求都需要重定向到
127.0.0.1:8080
。 - 注意: 127.0.0.1 :8080 通常可以包含子域名。但此子域名需要充当通配符,并且在配置时未知。示例:
bussiness1.example.com
,,,...bussiness2.example.com
businnesX.example.com
子域名返回一个个性化页面,无限数量的企业可以在 example.com 上请求该页面。
我该如何实现这种配置?我在想这样的事情?
#PSEUDO
events {}
http {
server {
listen 80;
# Website
location / {
proxy_pass http://127.0.0.1:8000;
}
location /news {
proxy_pass http://127.0.0.1:8000;
}
location /about {
proxy_pass http://127.0.0.1:8000;
}
# Application
location * {
proxy_pass http://127.0.0.1:8080;
}
}
}
编辑关于Tero的回答: 我需要一种用于子域名的通配符。
# Application catch-all
location / {
proxy_pass http://$subdomain.$application;
}
abc.example.com 需要转到 abc.127.0.0.1:8080 def.example.com 需要转到 def.127.0.0.1:8080 ...
我知道 IP 不能有子域名,但不用担心。我使用虚拟主机解决了这个问题。
编辑 2-将请求的子域传递给 proxy_pass:
server {
listen 80;
server_name *.website.com;
server_name ~^(?<subdomain>.+)\.website\.com$;
location / {
proxy_pass http://$subdomain.vhost.local:8080;
}
}
这是将 dynamicxxx.website.com 重定向到 dynamicxxx.vhost.local:8080 的正确方法吗?
答案1
您的设计有点复杂,因此很脆弱。但是,您可以尝试以下方法。我添加了upstream
块,以便不同的proxy_pass
目的地更具可读性。
upstream website {
server 127.0.0.1:8000;
}
upstream application {
server 127.0.0.1:8080;
}
server {
server_name example.com *.example.com;
listen 80;
# Application catch-all
location / {
proxy_pass http://application;
}
# Website
location = / {
proxy_pass http://website;
}
location /news {
proxy_pass http://website;
}
location /about {
proxy_pass http://website;
}
}
该=
字符表示 URI 上的精确匹配,并且是 nginx 查找过程中的首要任务,如中所述nginx 文档
另一种方法是使用正则表达式:
server {
server_name example.com *.example.com;
listen 80;
location / {
proxy_pass http://application;
}
location ~ ^(?:/|/news|/about) {
proxy_pass http://website;
}
}
告诉server_name example.com *.example.com
nginx 使用这些规则处理对主域和任何子域的所有请求。
如果网站请求规则只需要应用于example.com
,那么您需要定义另一个仅server
包含和应用规则的块server_name *.example.com
。
编辑
是的,子域名可以捕获到这样的变量中,并在proxy_pass
目标中使用。您需要将所有域名放在一行中server_name
:
server_name example.com ~^(?<subdomain>[^.]+)\.example\.com;