将子文件夹重定向到apache中的另一个本地IP

将子文件夹重定向到apache中的另一个本地IP

我有一台 Raspberry Pi,它可以通过域名 asada.net 运行并访问。它使用 apache 2.2.22 提供网页。

此外,我最近购买了一个 NAS,它在本地 apache 实例(嵌入式)中也有一个网页。

Raspberry pi的本地ip是192.168.0.4,NAS的本地ip是192.168.0.5。

每次我访问 www.asada.net 时,都会显示 raspberry pi 的根页面。

现在,我想要做的是将 www.asada.net/nas 重定向到 NAS 的 IP,192.168.0.5,以便从外部可以访问此页面。

我不希望 asada.net 指向 192.168.0.5,也不希望对其 apache 服务器进行任何更改,只是从 raspberry pi 重定向它。

所以我尝试过的所有配置都是在 raspberry pi 的 apache 中进行的。我启用了 mod_proxy;尝试了 ProxyPass 和 ProxyPassReverse,还尝试了 Location 指令……但都没有成功。

有人能帮助我吗?

提前致谢!

编辑:我的树莓派运行的是 Raspbian,apache 的版本是 2.2.22。这些是加载的模块:

Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 headers_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 proxy_balancer_module (shared)
 proxy_connect_module (shared)
 proxy_ftp_module (shared)
 proxy_html_module (shared)
 proxy_http_module (shared)
 proxy_scgi_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)
Syntax OK

编辑2:我已经取得了一些进展。这是我的 VirtualHost:

    <VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName asada.net
        ServerAlias www.asada.net
        DocumentRoot /var/www

        # NAS
        ProxyPreserveHost on
        ProxyPass /nas http://192.168.0.5
        ProxyPassReverse /nas http://192.168.0.5

    </VirtualHost>

现在,它不知怎么地就起作用了……网页已加载,但资源未加载。让我发布一张截图:

图片、javascript、css……未加载

我能做些什么?

编辑3: 朋友@Froggiz 推荐了我这里实现目标的方法有很多,所以我选择了我认为最适合我要求的方法:URL 映射。我放弃了子域名,因为我的域名是免费的(noip.com)。

目前,我的 VirtualHost 看起来像下面的一段代码:

    <VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName asada.net
        ServerAlias www.asada.net
        DocumentRoot /var/www

        # NAS
        ProxyPreserveHost on
        ProxyPass /nas http://192.168.0.5
        ProxyPassReverse /nas http://192.168.0.5

        ProxyHTMLURLMap http://192.168.0.5 /nas

        <Location /nas>
            ProxyPassReverse /
            SetOutputFilter proxy-html
            ProxyHTMLURLMap http://192.168.0.5 /nas
            ProxyHTMLURLMap / /nas
            ProxyHTMLURLMap /nas /nas
            RequestHeader unset Accept-Encoding
        </Location>

    </VirtualHost>

一切似乎都设置正确。当我在浏览器上输入 asada.net/nas 时,页面上会显示典型的损坏图像:

图像破损

而在调试控制台中,出现了一些奇怪的现象:每个需要加载的资源都出现了“加载资源失败:服务器响应状态为 404(未找到)”的错误。更奇怪的是,资源的链接(放在右侧)似乎在“...net/nas”之后和“web/...”之前缺少一个“/”:

http://asada.net/nasweb/css/job_list_icon.css?v=WDV1.01

我猜应该是

http://asada.net/nas/web/css/job_list_icon.css?v=WDV1.01

反而。

有什么想法吗?再次感谢您。

答案1

据我所知,RPI 为 www.asada.net 提供页面,这正是您想要的。除此之外,您希望通过 www.asada.net/nas 提供 NAS 页面。我非常确定这是可能的,但我建议如下:

  • NAS:nas.asada.net(您可能需要更改 DNS 才能使其正常工作)
  • RPI:www.asada.net,asada.net

这更容易处理,也更清楚。我想这对你来说不会有太大影响。

我认为你需要将 Apache 设置为 NAS 的代理服务器。为此你需要模块mod_proxy。您需要为 NAS 设置一个 vhost,并在该 vhost 内配置代理。

你没有告诉我们你使用的是哪种服务器。我猜是 Raspbian?哪个版本的 Apache - 2.2 还是 2.4?这可能会有很大的不同,所以请确保你获得正确的教程,如下所示:

如何使用 mod_proxy 扩展将 Apache HTTP 服务器用作反向代理

我看到您尝试过这样做,但没有成功。请告诉我们您使用的配置。让我们知道您尝试了什么。如果不知道您做了什么,我们就无法帮助您!

答案2

您不需要 mod_proxy 或类似的东西。您可以使用 mod_alias 来实现这一点,它包含在大多数默认 apache2 安装中。

在您的 vhost 配置中,或者在站点根目录的 .htaccess 文件中,只需添加此行:

Redirect /nas http://192.168.0.5

您应该这样做,Redirect 301 /nas http://192.168.0.5因为在 .4 地址上永远找不到它。但这对内部网络来说并不重要。301 重定向意味着“永久移动”。

编辑:有关 mod_alias 和重定向指令的更多信息:https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect

编辑02:我无意中跳过了你问题中的这一行:

以便该页面可以从外部访问。

这是我在这种情况下通常做的事情,因为它比反向代理更容易排除故障和维护。您需要转到基于主机名的地址。我们将按照 SPRBRN 的建议使用 nas.asada.net。在您的网络内部,设置 DNS,使 nas.asada.net 指向 192.168.0.5。在您的网络外部,它应该指向您的外部 IP 地址。

在 NAS 上,将访问端口更改为非默认端口。我从未遇到过无法执行此操作的情况。如果使用端口 80,则可以使用 8000;如果使用 443,则可以使用 1443。让防火墙为 NAS 转发此新端口。

然后制定如下指令:

Redirect 301 /nas http://nas.asada.net:8000[or whatever port your chose]

这样,访问您的 NAS 就不依赖于 raspberry pi 或任何其他网络设备。此外,如果您计划通过网络访问它,请确保您使用 SSL。

答案3

首先我向你解释一下问题:

命令

ProxyPass /nas http://192.168.0.5
ProxyPassReverse /nas http://192.168.0.5

将重定向http://asada.net/nashttp://192.168.0.5,因此当您尝试访问图像时它将在代码中http://192.168.0.5/example.gif,Apache 服务器将不会代理该图像,因为请求/example.gif不是由 开始的/nas

解决这个问题的方法有很多种。

更改路径以适应代理模式

ProxyPass /nas http://192.168.0.5/nas
ProxyPassReverse /nas http://192.168.0.5/nas

这样,当您访问时,所有请求都将被正确重定向http://asada.net/nas. 但在这种情况下,nas 需要从而http://192.168.0.5/nas不是http://192.168.0.5

添加子域名

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName asada.net
    ServerAlias www.asada.net
    DocumentRoot /var/www
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName nas.asada.net
    # NAS
    ProxyPreserveHost on
    ProxyPass / http://192.168.0.5
    ProxyPassReverse / http://192.168.0.5
</VirtualHost>

它与之前的解决方案完全相同,但采用了另一种方法,/将适合代理/请求。而且您将拥有一个专用地址来访问它。它会更干净。

使用 URL 映射

ProxyPass /nas/ http://192.168.0.5/
ProxyPassReverse /nas/ http://192.168.0.5/

ProxyHTMLURLMap http://192.168.0.5 /nas/

<Location /nas/>
   ProxyPassReverse /
   SetOutputFilter  proxy-html
   ProxyHTMLURLMap https://192.168.0.5 /nas/
   ProxyHTMLURLMap / /nas/
   ProxyHTMLURLMap  /nas/ /nas/
   RequestHeader    unset  Accept-Encoding
</Location>

答案如下apache2 反向代理 URL 映射不适用

使用替代

这我没办法,抱歉我还是不知道如何让替代品发挥作用

相关内容