我正在使用AngularJS开发NodeJS应用程序。 为了测试,我想将它托管在运行apache2 webserver的web服务器上。 谷歌搜索和尝试和错误让我想到我需要简单地让Apache使用代理模块转发请求:
<Location /someurl>
ProxyPass http://mydomain:3000/
ProxyPassReverse http://mydomain:3000/
</Location>
但不幸的是,我无法看到该页面。 访问someurl会给我一个空白页面,其中没有加载任何javaScript。
节点调试日志:
GET / 200 1.680 ms - 1687
当我通过端口3000访问服务器时,我得到以下日志:
GET / 304 53.814 ms - -
GET /javascripts/directives.js 200 14.369 ms - 6521
GET /javascripts/services.js 200 8.532 ms - 2054
GET /stylesheets/bootstrap.min.css 304 4.173 ms - -
GET /stylesheets/lmm.css 304 4.131 ms - -
GET /javascripts/jquery.min.js 304 4.203 ms - -
GET /javascripts/bootstrap.min.js 304 2.060 ms - -
GET /javascripts/angular.min.js 304 2.486 ms - -
GET /javascripts/angular-route.min.js 304 2.562 ms - -
GET /javascripts/angular-translate.min.js 304 2.643 ms - -
GET /javascripts/app.js 304 2.526 ms - -
GET /javascripts/controller.js 304 2.768 ms - -
GET /javascripts/translations.js 304 1.368 ms - -
GET /partials/footer.html 304 2.391 ms - -
GET /partials/home.html 304 2.202 ms - -
GET /fonts/glyphicons-halflings-regular.woff 304 1.602 ms - -
以下是来自acces.log的所有相关内容:
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /someurl HTTP/1.1" 200 852 "-"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /stylesheets/bootstrap.min.css HTTP/1.1" 404 513 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /stylesheets/lmm.css HTTP/1.1" 404 504 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/jquery.min.js HTTP/1.1" 404 509 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/bootstrap.min.js HTTP/1.1" 404 513 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular.min.js HTTP/1.1" 404 510 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-route.min.js HTTP/1.1" 404 517 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-translate.min.js HTTP/1.1" 404 520 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/controller.js HTTP/1.1" 404 509 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/app.js HTTP/1.1" 404 503 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/directives.js HTTP/1.1" 404 510 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/services.js HTTP/1.1" 404 507 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/translations.js HTTP/1.1" 404 511 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/bootstrap.min.js HTTP/1.1" 404 512 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular.min.js HTTP/1.1" 404 510 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-route.min.js HTTP/1.1" 404 516 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/angular-translate.min.js HTTP/1.1" 404 520 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/app.js HTTP/1.1" 404 502 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/controller.js HTTP/1.1" 404 509 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/directives.js HTTP/1.1" 404 509 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/services.js HTTP/1.1" 404 507 "http://mydomain/someurl"
myIP - - [13/Jan/2015:10:01:19 +0100] "GET /javascripts/translations.js HTTP/1.1" 404 511 "http://mydomain/someurl"
如何让apache正确转发请求?
答案 0 :(得分:2)
bennettp123的评论指出了我正确的方向。
Apaches access.log文件显示javaScript文件有404个错误 样式表。
在Location指令之前将它们添加为别名可以解决问题:
Alias /javascripts "<path_to_node_project>/public/javascripts"
Alias /stylesheets "<path_to_node_project>/public/stylesheets"
Alias /partials "<path_to_node_project>/public/partials"
答案 1 :(得分:2)
这是一个更好的解决方案(在How to use ProxyPass to serve static files through Express?找到):
在您的情况下,Apache Config是正确的。唯一缺少的部分是index.html中<head>
元素的更改,如下所示:
<base href="/someurl/">
答案 2 :(得分:0)
根据ProxyPassReverse的doco:
只会重写上面具体提到的HTTP响应头。 Apache不会重写其他响应头,也不会重写HTML页面中的URL引用。这意味着如果代理内容包含绝对URL引用,则它们将绕过代理。第三方模块将查看HTML并重写URL引用,这是Nick Kew的mod_proxy_html。
你的情况发生了什么。反向代理正在转发初始/someurl
请求。但是,NodeJS应用程序返回路径中没有/someurl
的URL,并且它们与ProxyPass和ProxyPassReverse指令不匹配。
有几个选择:
Alias
所有路径(如above)stylesheets/bootstrap.min.css
)