htaccess可以在不发出301的情况下返回另一个域的输出吗



假设我有abc.com和def.com。在def.com上,我有一个def.com/test.html,它显示";你好";。

我想这样做,如果我执行GET abc.com/something/,它会直接返回内容为def.com/test.html200而不是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)向自己发出重定向并有效地突破反向代理的将是微不足道的。尽管如此,如果目标域在您的控制范围内,这不一定是一个问题。

相关内容

  • 没有找到相关文章

最新更新