Apache HTTP 服务器重定向到端口 8085 IF url 包含 "demo" ELSE 重定向到端口 8080

Apache HTTP server redirect to port 8085 IF url contains "demo" ELSE redirect to port 8080

我在端口 8080 和 8085 上有 2 个应用程序 运行。两者有不同的 URL queries/paths 并且端口 8085 上的应用程序有关键字 demo 在其所有 URL queries/paths 上,而其他则没有。所以它充当唯一标识符

我能否对 /etc/httpd/conf/httpd.conf 文件进行任何更改,以便如果服务器将 demo 识别为关键字,则请求将到达端口 8085 上的应用程序,否则请求将到达端口 8080 上的端口应用程序?

如果有办法,请提供进入 httpd.conf 文件的示例配置

编辑 1:

在尝试了下面的前 2 个答案后,我无法做到这一点。我不知道 ProxyPass 和 ProxyPassReverse 是否不允许实现这一点。我尝试评论它们,将它们添加到 VirtualHost 等。但没有帮助。

这是我们期望的流程: 用户将点击 URL(不提及端口),例如 - https://example.com/demo,这将被路由到端口 8085 上的应用程序,否则路由到 8080

可能正在查看我的完整 httpd.conf 可能会有所帮助

Link 到我的 httpd.conf - https://gofile.io/d/tWIHvX

如果查询字符串包含单词“demo”,则重写条件:

<VirtualHost *:8080>          
    <Directory /var/www/example/>
        Allow From All
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !^8085$
        RewriteCond %{QUERY_STRING} (demo)
        RewriteRule ^Demo http://%{HTTP_HOST}:%{SERVER_PORT}/ [L,R]
    </Directory>
</VirtualHost>

如果查询字符串不包含单词“demo”,则重写条件:

<VirtualHost *:8085>          
    <Directory /var/www/example/>
        Allow From All
        RewriteEngine On
        RewriteCond %{SERVER_PORT} !^8080$
        RewriteCond %{QUERY_STRING} (!demo)
        RewriteRule ^Demo http://%{HTTP_HOST}:%{SERVER_PORT}/ [L,R]
    </Directory>
</VirtualHost>

如果SERVER_PORT不起作用,请直接尝试如下端口:

RewriteRule ^Demo http://%{HTTP_HOST}:8085/ [L,R]

尝试:

<VirtualHost *:8080>
#some conf
RewriteCond %{REQUEST_URI} demo [OR]
RewriteCond %{QUERY_STRING} demo
RewriteRule ^ http://%{HTTP_HOST}:8085%{REQUEST_URI} [QSA,L]
#some more conf
</VirtualHost>

<VirtualHost *:8085>
#some conf
RewriteCond %{REQUEST_URI} !demo
RewriteCond %{QUERY_STRING} !demo
RewriteRule ^ http://%{HTTP_HOST}:8080%{REQUEST_URI} [QSA,L]
#some more conf
</VirtualHost>

注:实现后自答

使用 LocationMatch 指令轻松实现。下面是配置。

因为这取决于正则表达式,您可以更改以检查条件,例如结尾、开头、包含等。下面的 LocationMatch 条件都在我的 httpd.conf

1.If URL like 192.168.1.113/demo 然后去8085

<LocationMatch "^/(demo)(.*)$">
  RewriteEngine on
  ProxyPass         http://localhost:8085/ nocanon
  ProxyPassReverse  http://localhost:8085/
</LocationMatch>

2.If URL not like 192.168.1.113/demo 然后去8080

<LocationMatch "^/((?!demo).)*$">
  RewriteEngine on
  ProxyPass         http://localhost:8080/ nocanon
  ProxyPassReverse  http://localhost:8080/
</LocationMatch>