1

嘿,我想使用 .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

我怎样才能做到这一点?

谢谢!

4

2 回答 2

1

不幸的是,HTTP 协议不支持这一点。

在执行您的第一个示例时,Web 服务器向请求浏览器发送一个“Location”标头,告诉浏览器导航到指定的 URL。浏览器尝试像普通网页一样加载这个新的 URL,包括在浏览器的地址栏中显示 URL。

由于浏览器是系统加载新的 URL,浏览器必须是系统重新 POST 提交的数据。网络服务器无法做到这一点。不幸的是,HTTP 协议没有为 Web 服务器提供一种方法来告诉浏览器执行此重新发布。

是否有其他方法可以实现您的目标?

于 2009-10-13T21:25:13.313 回答
0

我认为这是不可能的,因为要在浏览器中更改 URL,HTTP 服务器必须返回一些响应,这将告诉浏览器将 POST 数据发送到新 URL。据我所知,如果不使用 javascript,这是不可能的。当您指定 [P] 选项时,HTTP 服务器就像代理服务器一样,对浏览器隐藏真实的数据源。我看到了 2 个可能的解决方案:

  • 使用 GET 而不是 POST
  • 或创建一些在 HTTP 服务器上运行的脚本并进行 POST 重定向

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>
于 2009-10-13T21:20:10.257 回答