【问题标题】:Apache HTTP server redirect to port 8085 IF url contains "demo" ELSE redirect to port 8080Apache HTTP 服务器重定向到端口 8085 IF url 包含“演示” ELSE 重定向到端口 8080
【发布时间】:2021-08-20 04:22:11
【问题描述】:

我有 2 个应用程序在端口 8080 和 8085 上运行。两者都有不同的 URL 查询/路径,端口 8085 上的应用程序在其所有 URL 查询/路径上都有关键字 demo,而其他的则没有。所以它作为一个唯一的标识符

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

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

编辑 1:

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

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

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

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

【问题讨论】:

    标签: apache redirect routes httpd.conf


    【解决方案1】:

    如果查询字符串包含单词“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}/$1 [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}/$1 [L,R]
        </Directory>
    </VirtualHost>
    

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

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

    【讨论】:

    • 谢谢,如果可行,我会尝试并尽快接受。你能告诉我是否应该为/var/www/example/ 烦恼吗?
    • 您不必为 /var/www/example 烦恼,因为 HTTP_HOST 会根据配置自动选择文件夹。
    • 试过这个,但无法实现。附上我拥有的httpd.conf。可能会在某种程度上有所帮助
    【解决方案2】:

    试试:

    <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>
    

    【讨论】:

    • 试过这个,但无法实现。附上我拥有的httpd.conf。可能会在某种程度上有所帮助
    【解决方案3】:

    注意:实现后自行回答

    使用LocationMatch 指令轻松实现了这一点。下面是配置。

    由于这依赖于正则表达式,您可以更改以检查条件,如以结尾、开头、包含等。以下 LocationMatch 条件都在我的 httpd.conf 中

    1.如果网址为like 192.168.1.113/demo则转到8085

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

    2.如果网址为not like 192.168.1.113/demo则转到8080

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-29
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 2014-12-02
      • 2018-04-07
      相关资源
      最近更新 更多