Apache 重定向到另一个端口

我已经为此挣扎了一段时间,我肯定是做错了什么。

我在同一台机器上有 Apache 服务器和 JBoss 服务器。我想将 mydomain.example的流量重定向到 JBoss localhost:8080/example。DNS 目前是为 mydomain.example设置的,当进入浏览器时,它将直接进入端口80。

我的问题是,当某个域名到达 Apache (在本例中是 mydomain.example)时,如何重定向到另一个端口?

<VirtualHost ip.addr.is.here>
ProxyPreserveHost On
ProxyRequests Off
ServerName mydomain.example
ProxyPass http://mydomain.example http://localhost:8080/example
ProxyPassReverse http://mydomain.example http://localhost:8080/example
</VirtualHost>

在落实一些建议后:

  • 还是没有转发到端口8080

    <VirtualHost *:80>
    ProxyPreserveHost On
    ProxyRequests Off
    ServerName mydomain.example
    ServerAlias www.mydomain.example
    ProxyPass http://mydomain.example http://localhost:8080/example
    ProxyPassReverse http://mydomain.example http://localhost:8080/example
    </VirtualHost>
    
394372 次浏览

如果你不必使用代理到 JBoss 和 mydomain.example:8080可以“公开”的世界,那么我会这样做。

<VirtualHost *:80>
ServerName mydomain.example
Redirect 301 / http://mydomain.example:8080/
</VirtualHost>

Apache 支持基于名称和基于 IP 的虚拟主机。看起来你两个都用了,这可能不是你需要的。

我认为您实际上是在设置 基于名称的虚拟主机,因此不需要指定 IP 地址。

尝试 < VirtualHost * : 80 > 绑定到所有 IP 地址,除非您真的想要 基于 IP 的虚拟主机。如果服务器有多个 IP 地址,并且您希望在不同的地址上服务不同的站点,则可能会出现这种情况。最常见的设置是(我猜)基于名称的虚拟主机。

你需要两样东西:

  1. 向配置中添加 ServerAlias www.mydomain.example
  2. 将您的代理转换为 ProxyPassMatch ^(.*)$ http://localhost:8080/example$1,以防止 mod _ dir 和拖尾斜杠干扰。

您应该省略 ProxyPass 和 ProxyPassRT 中的域 http://example.com,并将其保留为 /。另外,您需要将 /保留在 example/的末尾,以便它重定向。而且,我在 http://example.comhttp://www.example.com之间遇到了一些麻烦——在我创建 ServerName www.example.com 和 ServerAlias example.com 之前,只有 www 可以工作。试试下面这个。

<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName www.example.com
ServerAlias example.com
ProxyPass / http://localhost:8080/example/
ProxyPassReverse / http://localhost:8080/example/
</VirtualHost>

进行这些更改之后,添加所需的模块并重新启动 apache

sudo a2enmod proxy && sudo a2enmod proxy_http && sudo service apache2 restart

我用以下代码解决了这个问题:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName myhost.example
ServerAlias www.myhost.example
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>

我还用了:

a2enmod proxy_http

我想这么做是为了从根域名访问 Jenkins。

我发现我必须禁用默认站点才能让它工作。

$ sudo vi /etc/apache2/sites-available/jenkins

然后把这个插入文件:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName mydomain.example
ServerAlias mydomain
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>

下一步,你需要启用/禁用适当的网站:

$ sudo a2ensite jenkins
$ sudo a2dissite default
$ sudo service apache2 reload

只需在 apache 配置中使用反向代理(直接) :

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

在这里可以找到关于如何使用 mod 的 Apache 文档

这可能是个老问题了,但我是这么做的:

在 Apache 加载的.conf 文件中:

<VirtualHost *:80>
ServerName something.com
ProxyPass / http://localhost:8080/
</VirtualHost>

说明: 监听对本地机器80端口的所有请求。如果我请求“ http://something.com/somethingorother”,请将请求转发到“ http://localhost:8080/somethingorother”。这应该对外部访问者有效,因为根据文档,它将远程请求映射到本地服务器的空间。

我正在运行 Apache 2.4.6-2ubuntu2.2,所以我不确定“-2ubuntu2.2”如何影响这个答案更广泛的适用性。

通过反复试验发现了这一点。如果您的配置指定了 ServerName,那么您的 VirtualHost 指令将需要执行相同的操作。在下面的示例中, awesome.example.com 和 amazing.example.com 都将被转发到在端口4567上运行的一些本地服务。

ServerName example.com:80


<VirtualHost example.com:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName awesome.example.com
ServerAlias amazing.example.com
ProxyPass / http://localhost:4567/
ProxyPassReverse / http://localhost:4567/
</VirtualHost>

我知道这不能完全回答这个问题,但是我把它放在这里是因为这是 Apache 端口转发的最高搜索结果。所以我想总有一天它会帮到别人。

必须确保在服务器上启用了代理。你可使用以下命令:

  a2enmod proxy
a2enmod proxy_http


service apache2 restart

所有这些都是通过虚拟服务器上的域名访问端口的卓越见解。但是,不要忘记启用虚拟服务器; 这可能会被注释掉:

NameVirtualHost *:80
<Directory "/home/dawba/www/">
allow from all
</Directory>

我们使用域 sxxxx.com 上的 Apache 服务器和端口6800上运行的 golang 服务器运行 WSGI。有些防火墙似乎用端口来阻止域名。这就是我们的解决方案:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName wsgi.sxxxx.example
DocumentRoot "/home/dxxxx/www"
<Directory "/home/dxxx/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ScriptAlias /py/ "/home/dxxxx/www/py/"
WSGIScriptAlias /wsgiprog /home/dxxxx/www/wsgiprog/Form/Start.wsgi
</VirtualHost>


<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName sxxxx.com
ServerAlias www.sxxxx.com
ProxyPass / http://localhost:6800/
ProxyPassReverse / http://localhost:6800/
</VirtualHost>

我的阿帕奇监听两个不同的端口,

Listen 8080
Listen 80

我使用80时,我想要一个透明的 URL,不把端口后的 URL 有用的谷歌服务,不允许本地网址?

但是我使用8080进行内部开发,其中我使用该端口作为“开发环境”的参考

这也可以在 ISPConfig 中使用。在网站列表中进入域名,点击选项卡,添加以下内容: ;

ProxyPass / http://localhost:8181/
ProxyPassReverse / http://localhost:8181/

然后登录网站 Wolaa:)这也是 HTTPS 协议。

试试这个

<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName www.adminbackend.example.com
ServerAlias adminbackend.example.com
ProxyPass / http://localhost:6000/
ProxyPassReverse / http://localhost:6000/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

这就是我如何将部分请求重定向到一个 url 并将 rest 重定向到另一个 url 的方法:

<VirtualHost *:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName localhost
ProxyPass /context/static/content http://localhost:80/web/
ProxyPassReverse /context/static/content http://localhost:80/web/
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</VirtualHost>