Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以重定向post数据?_Php_Apache_.htaccess - Fatal编程技术网

Php 是否可以重定向post数据?

Php 是否可以重定向post数据?,php,apache,.htaccess,Php,Apache,.htaccess,我有一个网站,所有的请求都被无声地重定向(通过.htaccess)到index.php,然后php被用来显示正确的页面(通过解析请求URI) 我想知道是否有可能将帖子数据提交到一个假地址 我现在的表格是这样的 <form action="/send-mail" method="post"> 我的index.php检查isset($\u GET['send-mail'])工作正常 然而,这似乎减少了所有应该发送给它的POST数据 有没有办法保存post数据?我不想使用GET,因为它不

我有一个网站,所有的请求都被无声地重定向(通过
.htaccess
)到
index.php
,然后php被用来显示正确的页面(通过解析
请求URI

我想知道是否有可能将帖子数据提交到一个假地址

我现在的表格是这样的

<form action="/send-mail" method="post">
我的
index.php
检查
isset($\u GET['send-mail'])
工作正常

然而,这似乎减少了所有应该发送给它的POST数据

有没有办法保存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
试试这个:

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

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

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

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

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

您应该能够简单地重定向到
index.PHP
,然后在该脚本中,访问
$\u SERVER['REQUEST\u URI']
以查看原始请求,同时“发送邮件”保持不变

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


假设您在页面上放置了一个带有GET请求的超链接,如“
/delete\u user?id=1234
,”,然后某个搜索引擎在为您的站点编制索引时天真地跟随该链接。这就是为什么GET请求不适合修改数据的请求。

我想将user_login.php重定向到seo友好的url,比如/user login with post form data,这对我很有用

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">

为避免某些代理和Apache重写出现问题,请传入
POST
数据,或为正文为空的请求设置
内容长度:0
标头

我最近遇到了一个问题,Apache将我的请求转换为一个
GET
,当我用一个空的主体执行
POST
时。因此,与此相反:

 curl -X POST https://example.com/api/user/123456789
传递
内容长度
标题:

 curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0'
或者在体内传递一些东西:

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

不,我要返回200行:像浏览器这样的slook在被重定向后将使用
GET
进行第二次请求…没有第二次请求需要重写。只有重定向(位置头和3xx响应)有第二个请求。其中有一个小限制,一旦达到某个任意限制(我认为是1024个字符),它后面的数据就会从请求中剥离。如果它恰好是一个用户输入字段,则问题尤其严重。(注意:限制是服务器和浏览器特定的,RFC说它是无限制的,但我们知道一些公司经常读到这一点)+1我有点开窍,因为我问了这个问题,现在完全理解了所有数据的修改。请注意,您需要启用代理模块,以及配置文件中的proxy_http_模块,以使其正常工作。此外,您可能需要设置重写规则的绝对路径。也就是说,在上面的示例中,如果希望保留主机头,您可以使用
重写规则send mail/path/to/index/index.php?send mail[NC,P]
(或者至少在索引之前使用
/
),您还需要在apache config中启用
上的
ProxyPreserveHost
 curl -X POST https://example.com/api/user/123456789 -d ''