我有两个应用程序。
- 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 的正确方法吗?
您的设计有点复杂,因此很脆弱。但是,您可以尝试以下方法。我添加了
upstream
块,以便不同的proxy_pass
目的地更具可读性。该
=
字符表示 URI 上的完全匹配,并且是 nginx 查找过程中的第一优先级,如nginx 文档中所述另一种方法是使用正则表达式:
server_name example.com *.example.com
告诉 nginx 使用这些规则处理对主域和任何子域的所有请求。如果网站请求规则只需要适用于
example.com
,那么您只需定义另一个server
块server_name *.example.com
和 应用规则。编辑
是的,子域可以被捕获到这样的变量中,并在
proxy_pass
目的地中使用。您需要将所有域放在server_name
一行中: