带有 ProxyPass 到 node.js 服务器的 Apache VirtualHost 拒绝工作(“无法解析主机名”)

带有 ProxyPass 到 node.js 服务器的 Apache VirtualHost 拒绝工作(“无法解析主机名”)

我在我的 Mac 上运行本地 Apache 进行开发,同时还在 上运行 node.js 服务器http://127.0.0.1:8000/

我使用.dev域名进行 Apache 项目,并希望.node域名重定向到 node.js 服务器。我已设置虚拟主机,如下所示:

<VirtualHost *.dev:80>
    VirtualDocumentRoot "/www/sites/%1/wwwroot"
    ServerName sites.dev
    ServerAlias *.dev
    UseCanonicalName Off
</VirtualHost>

<VirtualHost *.node:80>
    ServerName sites.node
    ProxyPass "/" "http://localhost:8000"
    ProxyPassReverse "/" "http://localhost:8000"
</VirtualHost>

但是,当我尝试应用这些设置时,出现错误:

[core:error] [pid 8594] (EAI 8)nodename nor servname provided, or not known: 
AH00547: Could not resolve host name *.node -- ignoring!

我应该注意到.dev域按预期工作,并且可以在 访问 node.js 服务器http://localhost:8000/,但不能在 访问http://test.node/

我这里遗漏了什么吗?

答案1

<VirtualHost *.dev:80>
    VirtualDocumentRoot "/www/sites/%1/wwwroot"
    ServerName sites.dev
    ServerAlias *.dev
    UseCanonicalName Off
</VirtualHost>

<VirtualHost *.node:80>
    ServerName sites.node
    ProxyRequests on
    RewriteEngine on
    <Proxy *>
             Order deny,allow
             Allow from all
    </Proxy>
    ProxyPass "/" "http://localhost:8000"
    ProxyPassReverse "/" "http://localhost:8000"
</VirtualHost>

这是如何运作的?

答案2

我解决了自己的问题,这里就是错误的地方:

  1. 我应该确保自定义域确实解析为localhost

对于 Mac 上的自制 dnsmasq,这可以解决问题:

echo 'address=/.no/127.0.0.1' > $(brew --prefix)/etc/dnsmasq.conf

然后 OS X 应该被告知在本地查找自定义域:

sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/no'
  1. 代理重定向的 VirtualHost 规则应尽快出现在配置文件中。否则,Apache 可能会将您的自定义域请求重定向到 ,localhost而不附加自定义端口:8000

像这样:

<VirtualHost *.no:80>
    ServerName sites.no
    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>

<VirtualHost *.dev:80>
    VirtualDocumentRoot "/www/sites/%1/wwwroot"
    ServerName sites.dev
    ServerAlias *.dev
    UseCanonicalName Off
</VirtualHost>
  1. 自定义域名.node目前不是有效的顶级域名,根据 IANA。将其更改为有效内容(例如.no),可防止 Safari 在收到诸如 之类的请求时启动 Google 搜索test.no。(不过,请与.no那里的真实网站说再见。)

就是这样。

相关内容