我有一台 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>
现在,它不知怎么地就起作用了……网页已加载,但资源未加载。让我发布一张截图:
我能做些什么?
编辑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/...”之前缺少一个“/”:
我猜应该是
反而。
有什么想法吗?再次感谢您。
答案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/nas
到http://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>
使用替代
这我没办法,抱歉我还是不知道如何让替代品发挥作用