使用curl跟随重定向并带着POST请求

3
我正在使用cURL将POST数据发布到PHP脚本:http://localhost/example/index.php
如何隐藏index.php并仅发布到http://localhost/example
我尝试过直接发布,但是我收到了301永久移动标头,并且如果我将CURLOPT_FOLLOWLOCATION设置为TRUE,则请求会跟随,但似乎会丢失POST数据-我在远程端点上什么也没有得到,使用这个file_get_contents('php://input')。

为什么确切地说这是必要的呢? - Vap0r
1
如果你在结尾处加上一个斜杠,例如:localhost/example/,会发生什么呢?听起来你可能会从mod_dir得到一个结尾斜杠重定向。 http://httpd.apache.org/docs/2.1/mod/mod_dir.html - mqsoh
"example"将被第三方调用,我不希望他们看到我使用的是哪种语言、这是哪个文件等信息。 - donk
mqsoh - 是的!成功了。如此简单的小错误。如果您将此作为答案发布,我会接受它。另外,是否有一种方法可以同时接受带和不带尾随斜杠的情况?我不希望第三方犯我所犯的同样错误。 - donk
1个回答

2

在重定向时,POST数据会丢失,这是无法避免的。

要实现您需要的功能,您可以在.htaccess中指定(假设您运行Apache):

DirectoryIndex index.php

通过请求 http://localhost/example/,您将在该目录中收到 index.php。

问题出现在如果您想为去掉尾随斜杠的请求 http://localhost/example(没有斜杠)提供 index.php,因为 Apache 默认会重定向到带有尾随斜杠的 URL,并在此过程中丢失 POST 数据。为了解决这个问题,您可以伪造请求目录:

RewriteRule fakedirthatuserknows/?$ /realscriptdir/index.php [L]
< p > /? 将 Apache 指向同时包含和不包含尾部斜杠的规则。为了避免重定向,需要跳过 R=301 标志并将其改为 [L]。如果使用重定向,则应该是 [R=301,L]


感谢详细的解释。虽然我仍然无法编写htaccess规则来接受或重写带有和不带有尾随斜杠的URL到index.php。问题在于所有的解决方案都是通过301重定向完成的,这会导致curl丢失POST数据。当我达到这个点时,我将使用DirectoryIndex更改脚本的默认名称以进行更多的掩盖。 - donk
我之前在示例中设置了规则,而不是在本地主机上设置,谢谢。但现在我收到了302 Found响应头,参数仍未传递。 - donk
深入研究curl_info(),查看是否实际上使用FOLLOWLOCATION = FALSE获取了index.php响应。如果是这样,参数不会丢失,因为没有重定向。 - Ranty
如果我查询URL http://localhost/example,我会得到一个301重定向 - 它会导向http://localhost/example/(带有尾随斜杠)。看起来RewriteRule example/?$ /example/index.php [L]规则不像我想要的那样工作。但它肯定做了些什么,因为没有它,我只会得到一个302 Found头。 - donk
1
经过一番思考,也许Apache默认会添加尾部斜杠?那么解决方案就是伪造一个请求目录。RewriteRule fakedirthatuserknows/?$ /realscriptdir/index.php [L] - Ranty
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接