假设我有abc.com和def.com。在def.com上,我有一个def.com/test.html
,它显示";你好";。
我想这样做,如果我执行GET abc.com/something/
,它会直接返回内容为def.com/test.html
的200
,而不是301 def.com/test.html
。我不想让用户知道2台服务器之间发生了通信。
现在,我可以设置一个abc.com/.htaccess
到url重写为abc.com/test.php
,这将负责用CURL响应其他网站的内容,如下所示:
<?
$url = "def.com/test.html"; //Would be received from the .htaccess's URL rewrite, say $_GET['wantedURL']
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
但是,有没有一种方法可以告诉.htaccess自己执行CURL(或者返回一个shell脚本的输出),如下所示?
RewriteEngine on
RewriteRule ^/something/$ <curl def.com/test.html> [L]
#NOT THIS: RewriteRule ^/something/$ def.com/test.html [R=301,L]
当然,对于给定模式的几个动态URL,我会这样做,所以我只对路径进行了硬编码,以解释我正在寻找的
谢谢!
---编辑---
我发现ProxyPass和ProxyPassReverse可以在htaccess中工作吗?这似乎需要把它放在vhosts配置中,这是我想避免的。我更希望它能通过.htaccess完成。在.htacccess中尝试以上操作会产生他们确实解释为不可能的结果:ProxyPassReverse not allowed here
---编辑2-
根据@MrWhite的建议,我现在获得No protocol handler was valid for the URL /something/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule
但我认为一切都很沉重。当我做httpd -M | grep "proxy"
时,我得到:
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
顺便说一句,这是我的vhost:
<VirtualHost *:80>
ServerName abc.com
ProxyPass "/" "https://def.com/"
ProxyPassReverse "/" "https://def.com/"
</VirtualHost>
在.htaccess
中,您可以使用mod_rewriteRewriteRule
指令上的P
(proxy
)标志通过mod_proxy发送请求。
例如,在abc.com
的.htaccess
文件中:
RewriteEngine on
RewriteRule ^something/$ https://def.com/test.html [P]
(注意,在.htaccess
中使用时,RewriteRule
模式匹配的URL路径不会以斜线开头。)
然而,这自然需要在服务器配置中加载/启用mod_proxy和相关模块。
如果你没有在服务器配置中设置ProxyPassReverse
(正如你所说,这在.htaccess
中是不允许的),那么目标域(即def.com
)向自己发出重定向并有效地突破反向代理的将是微不足道的。尽管如此,如果目标域在您的控制范围内,这不一定是一个问题。