如何将子域重定向到同一服务器上的其他端口?


67

我有一些子域,我想重定向到同一服务器上的特定端口。说我有

dev.mydomain.com 

我想dev.mydomain.com透明地重定向到mydomain.com:8080,我想保留原始子域名的浏览器URL。

如何使用Apache 2.2做到这一点?我在默认端口上运行Apache 2.2 80。我无法弄清楚写入配置来实现这一点。

我已经设置dev.mydomain.com要在DNS中解析为mydomain.com

这是针对具有不可路由IP地址的Intranet开发服务器的,因此我不太担心会损害面向公众的服务器的漏洞利用和安全性。

Answers:


69

这是我在Miles Erickson设定正确方向后终于想到的。我希望地址栏反映请求的原始子域/域,而不是重定向的服务器和端口,但他使我在使用Google解决方案的正确路径上VirtualHost找到了解决方案,最后我找到了一个使用的解决方案mod_proxy

<VirtualHost *:80>
    ServerAdmin me@mydomain.com
    ServerName dev.mydomain.com
    ProxyPreserveHost On

    # setup the proxy
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:8888/
    ProxyPassReverse / http://localhost:8888/
</VirtualHost>

7
对于这个答案不起作用的每个人,请记住,您还必须同时启用mod mod_proxyproxy_http
matewka

9

假设可以将dev.mydomain.com解析为mydomain.com的IP,则可以将以下内容添加到httpd.conf中:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName dev.mydomain.com
    redirect / http://mydomain.com:8080/
</VirtualHost>

相关的Apache文档:

  1. 创建基于名称的虚拟主机指南
  2. 核心,包括VirtualHostNameVirtualHost
  3. 重新导向

相关问题: 基于主机名的Apache重定向

(注意:此答案的原始版本错误地建议使用RedirectMatch,正如@ChrisS所指出的那样,该方法无法解析URL的域部分。)


1
请参阅我自己提供的关于我实际使用的答案,这是VirtualHost与mod_proxy一起保存原始主机而不进行重定向的想法。这是一台内部服务器,因此我不关心安全性或对mod_proxy的利用。

1
找到了许多其他建议,但这最终在Windows Server 2008 R2 / Apache 2.2.25上对我有用。
HPWD

1
此解决方案的问题在于,在您的兄弟中,您不停留在第一个域上,而第二个则得到302。
Pleymor'2

7

在终端上运行以下行(正确指定您的域名和子域名)

sudo nano /etc/apache2/sites-available/subdomain.example.com.conf 

粘贴以下代码并根据需要进行更改

<VirtualHost *:80>
        ServerAdmin admin@example.com
        ServerName subdomain.example.com
        ServerAlias subdomain.example.com
        ProxyRequests Off

        #ProxyPass / http://localhost:8080/
        <Location />
                ProxyPreserveHost On
                ProxyPass http://example.com:8080/
                ProxyPassReverse http://example.com:8080/
        </Location>
     # Uncomment the line below if your site uses SSL.
     #SSLProxyEngine On
</VirtualHost>

在终端上运行以下行(正确指定您的域名和子域名)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart

3
此答案与接受的答案之间有本质区别吗?
kasperd '16

1
大多数人忘记添加,sudo a2enmod proxy_http因此他们在正常运行方面面临困难。另外,我尝试按顺序给出从头到尾的完整过程,以帮助您更好地适应。感谢您的提问。
MAK Ripon

1
+1是因为提及“ ProxyRequests Off”
塞巴斯蒂安

1
这对我不起作用。“ sudo a2enmod subdomain.domain.com.conf”说“错误:模块xyz不存在!” 是否必须在“默认”配置中提及?
Dirk Schumacher

2
更正注册子域名 sudo a2ensite sub.yourdomain.com
Ali Azhar

5

在您的主要vhost配置中添加以下几行:

ProxyPreserveHost On
ProxyPass / http://example.com:8080/
ProxyPassReverse / http://example:8080/

请注意,这需要在Apache上使用mod_proxy。


这不是重定向;它代理连接。如果您不太谨慎地配置mod_proxy,则启用它非常容易。我强烈反对这样做。
克里斯·S

4
根据他的操作,他不希望重定向。他希望原始URL保留在地址栏中。这意味着使用mod_proxy或mod_rewrite,最好避免使用mod_rewrite。
适配器2012年

4

您正在寻找mod_rewrite。这是Apache文档的链接,其中包括许多基本高级配置示例。

并且,如果您无法自己解释文档,请尝试将其添加到httpd.conf中:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^dev\.example\.com$ [NC]        
RewriteRule ^(.*)$ http://example.com:8080$1 [R=301]    

如果不是一个清晰的示例,这也是指向mod_rewrite初学者指南链接


1
我正在共享主机上。重写是唯一的选择。我可以创建.htaccess文件,但不能创建代理或虚拟主机。
abalter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.