我正在使用 WAMP 设置本地环境以进行测试。
该应用程序(Angular 应用程序)位于 /wamp/www/app/ 目录中。它通过将请求发送到同一服务器上的另一个路由来向另一个 API 发出请求。(具体来说是 /wamp/www/api/route)
我们有一个 dev api 服务器,位于http://api.com。我们有另一个角度应用程序的测试实例http://testapp.com/app/可以发送请求至http://api.com通过指向http://testapp.com/api/route。
在测试实例(非本地)中,我们有一个 .htaccess 文件http://testapp.com/api/route接收请求http://testapp.com/api/route/* 并将它们发送到http://api.com/*
执行此操作的 .htaccess 文件如下:
<IfModule mod_rewrite.c>
RewriteRule (.*) http://api.com/$1 [NC,P]
</IfModule>
当我将此 .htaccess 文件复制到我的 /wamp/www/api/route/ 目录时,我预期会出现以下行为:
我想要的是
该应用程序将向 /wamp/www/api/route/stuff/ 发送请求,/route/ 中的 .htaccess 文件接收该请求,并将其代理到http://api.com/stuff
我得到了什么
该应用程序将向 /wamp/www/api/route/stuff/ 发送请求,并得到 404 返回。
我已确保已设置 AllowOverride all、重写引擎已打开并且 mod-rewrite 已启用。我知道 .htaccess 文件正在被查看,因为如果我将垃圾放入其中,我会得到 500 而不是 404,并且我的垃圾会进入日志。
任何帮助都将不胜感激!谢谢。
在 Purefan 的帮助下,我启用了重写日志记录,自启用以来,没有任何重写尝试,这表明重写规则从未在请求上执行。
我现在尝试改变调用重写规则的流程。
我在httpd配置文件中创建了一个目录,如下所示:
<Directory "c:/wamp64/www/api/route">
Options +FollowSymLinks
RewriteEngine on
<IfModule mod_rewrite.c>
RewriteRule (.*) http://api.com/$1 [NC,P]
</IfModule>
</Directory>
我仍然得到同样的行为
答案1
感谢 Purefan,启用重写日志后,我看到重写正在尝试重写,但请求从未发送。
当我从 RewriteRule 中删除 P 标志时,它会重写请求,但我的标头不会被添加,因为我们没有代理,而这是我需要做的。
这让我意识到代理无法正常工作,并立即想到了这个解决方案:
在 httpd.conf 文件中,更改
#LoadModule proxy_module modules/mod_proxy.so
到
LoadModule proxy_module modules/mod_proxy.so
总结
如果要在重写规则中使用 P 标志进行代理,请启用 mod_proxy