是否可以重定向发布数据?

时间:2008-12-11 02:10:07

标签: php apache .htaccess

我有一个网站,其中所有请求都以静默方式(通过.htaccess)重定向到index.php,然后PHP用于显示正确的页面(通过解析REQUEST_URI)。

我想知道是否可以将POST数据提交到假地址?

我目前的形式是这样......

<form action="/send-mail" method="post">

我的.htaccess规则是......

# redirect mail posting to index
RewriteRule send-mail index.php?send-mail [NC,L] 

我的index.php支票isset($_GET['send-mail'])可以正常使用。

然而,这似乎会丢弃应发送给它的所有POST数据。

有没有办法保留帖子数据?我不想使用GET,因为它不能发送尽可能多的信息,尽管它可能不是一个简单的查询表格的问题。

我的.htaccess用于重定向到index.php

# serve files and dirs if they exist please, otherwise send to index
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

6 个答案:

答案 0 :(得分:60)

试试这个:

# redirect mail posting to index
     RewriteRule send-mail index.php?send-mail [NC,P]

“P”的作用类似于“L”,因为它会停止处理规则,但它也会告诉模块该请求应该完整地传递给代理模块(意味着POST数据被保留)。

答案 1 :(得分:7)

您应该只需重定向到index.php,然后在该脚本中访问$_SERVER['REQUEST_URI']即可查看原始请求,并且“发送邮件”完好无损。

顺便说一句,“不能发送尽可能多的信息”不是使用POST的原因。使用POST的原因是请求将修改您网站上的数据,而不是简单地检索数据。

假设您在页面上添加了一个带有GET请求的超链接,例如“/delete_user?id=1234”,然后一些搜索引擎无意中跟随链接,因为它正在索引您的网站。这就是为什么GET请求不适合修改数据的请求。

答案 2 :(得分:1)

为了避免某些代理和Apache重写的问题,请传入POST数据或为空主体的请求设置Content-Length: 0标头。

我最近遇到的问题是,在执行GET空主体时,我将请求转换为POST。所以,而不是:

 curl -X POST https://example.com/api/user/123456789

传递Content-Length标题:

 curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0'

或传递身体内的东西:

 curl -X POST https://example.com/api/user/123456789 -d ''

答案 3 :(得分:1)

我发现最可靠的方法是使用 307 状态代码。

RewriteRule send-mail index.php?send-mail [R=307,L]

状态代码 307 表示应使用相同的 HTTP 方法和数据重复请求。因此,如果您使用此状态代码,您的 POST 请求将与其数据一起重复。

如果您需要支持非 POST 请求的标准 301 重定向,您也可以检测请求是否为 POST 请求。

# POST requests.
RewriteCond %{REQUEST_METHOD} POST
RewriteRule send-mail index.php?send-mail [R=307,L]

# Standard GET requests.
RewriteRule send-mail index.php?send-mail [R=301,L]

答案 4 :(得分:0)

只要您只使用内部重写,而不是HTTP重定向,就不应该丢失POST数据。这是我在我的网站上使用的规则:

RewriteRule ^(.*)$ index.php/$1 [L]

尝试使用适用于Firefox的HTTPLiveHeaders扩展程序(或类似内容)并跟踪整个页面请求。确保您没有获得HTTP重定向。如果您收到 HTTP / 1.1 3xx 响应和位置: http://address 标头,那就是问题所在。您发布的重写规则不应导致这种情况发生。如果要重定向,可能是PHP代码中的错误或正在应用的其他重写规则。

答案 5 :(得分:0)

我想将user_login.php重定向到seo友好的网址,例如/ user-login和帖子表单数据,这对我有用。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/user_login\.php [NC]
RewriteRule ^ user-login [QSA,R=301]
RewriteRule ^user-login$ user_login.php [QSA,L]

在视图文件

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login">