我有一个网站,其中所有请求都以静默方式(通过.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
答案 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">