嘿,我想使用.htaccess将请求的页面重定向到不同域上的完全相同的页面,我希望它在将地址栏更改为新域时转发所有POST数据,就像正常的重定向一样。
这是我的代码。
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.domain1.com/$1 [R=301,L]
问题是POST数据不是以这种方式发送的。然后我尝试了这个:
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.domain1.com/$1 [R=301,P]
这可以转发POST数据,但地址栏不会更改为新的domain1.com
我该如何做到这一点?
谢谢!
答案 0 :(得分:1)
不幸的是,HTTP协议不支持此功能。
执行第一个示例时,Web服务器向请求浏览器发送“位置”标题,告知浏览器导航到指定的URL。浏览器尝试像普通网页一样加载这个新URL,包括在浏览器的地址栏中显示URL。
由于浏览器是系统加载新URL,因此浏览器必须是系统才能重新提交提交的数据。 Web服务器无法执行此操作。不幸的是,HTTP协议没有为Web服务器提供一种方法来告诉浏览器预先形成这种重新发布的方式。
是否有其他方法可以实现目标?
答案 1 :(得分:0)
我认为这是不可能的,因为要在浏览器中更改URL,HTTP服务器必须返回一些响应,这将告诉浏览器将POST数据发送到新URL。据我所知,如果不使用javascript就不可行。 当您指定[P]选项时,HTTP服务器就像代理服务器一样,从浏览器隐藏真正的数据源。 我看到了两个可行的解决方案:
UPD: 您可以创建PHP脚本,它将成为您重定向规则的处理程序。该脚本应该创建以下html代码:
<body onload="document.forms[0].submit()">
<form action="post" action="<?=$your_new_url_here>">
<?php
foreach ($_POST as $param => $value):
?>
<input type="hidden"
name="<?=htmlspecialchars($param)?>"
value="<?=htmlspecialchars($value)?>" />
<?php
endforeach;
?>
</form>
</body>