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

lxkprmvk  于 2022-11-16  发布在  其他
关注(0)|答案(6)|浏览(116)

我有一个网站,所有的请求都被静默地重定向(通过.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
9ceoxa92

9ceoxa921#

试试看:

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

“P”的作用与“L”类似,它停止处理规则,但它还告诉模块请求应原封不动地传递给代理模块(意味着保留POST数据)。

7ajki6be

7ajki6be2#

您应该能够简单地重定向到index.php,然后在该脚本中访问$_SERVER['REQUEST_URI']以查看原始请求,“send-mail”保持不变。
顺便说一下,“不能发送那么多信息”不是使用POST的原因,使用POST的原因是请求将修改您站点上的数据,而不是简单地检索数据。
假设你在页面上放了一个超链接,并发出GET请求,比如“/delete_user?id=1234”,然后某个搜索引擎在索引你的网站时无意中跟踪了这个链接,这就是为什么GET请求不适合修改数据的请求。

1wnzp6jl

1wnzp6jl3#

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

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

状态码307表示请求应该使用相同的HTTP方法和数据重复。因此,如果使用此状态码,您的POST请求将与其数据沿着重复。
您也可以检测请求是否为POST请求,以防您需要为非POST请求支持标准301重定向。

# 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]
3ks5zfa0

3ks5zfa04#

我想将user_login. php重定向到seo友好的url,如/user-login,并使用post表单数据,这对我很有效。

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

cgfeq70w5#

为了避免某些代理和Apache重写出现问题,请传入POST数据或为正文为空的请求设置Content-Length: 0标头。
我最近在Apache将我的请求转换为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 ''
yptwkmov

yptwkmov6#

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

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

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

相关问题