Php 当404通过.htaccess重定向时,如何获取“$\u POST”查询?

Php 当404通过.htaccess重定向时,如何获取“$\u POST”查询?,php,.htaccess,Php,.htaccess,这个问题与我的想法有些关联。使用$\u服务器['REDIRECT\u QUERY\u STRING']的技巧似乎只适用于$\u GET变量 我有一个index.php文件,它处理所有404重定向 如果用户请求一个不存在的页面,比如说,apple.php?item=23,那么使用$\u服务器['REDIRECT\u QUERY\u STRING']我可以得到$\u get变量item=23,但是如果变量不是$\u get而是$\u POST,那么$\u服务器['REDIRECT\u QUERY\u

这个问题与我的想法有些关联。使用
$\u服务器['REDIRECT\u QUERY\u STRING']
的技巧似乎只适用于
$\u GET
变量

我有一个
index.php
文件,它处理所有
404重定向

如果用户请求一个不存在的页面,比如说,
apple.php?item=23
,那么使用
$\u服务器['REDIRECT\u QUERY\u STRING']
我可以得到
$\u get
变量
item=23
,但是如果变量不是
$\u get
而是
$\u POST
,那么
$\u服务器['REDIRECT\u QUERY\u STRING']
不起作用

使用以下.htaccess设置将
$\u POST
变量重定向到
index.php
时,如何获取该变量

ErrorDocument 404/index.php


根据以下指令:

ErrorDocument 404 /index.php
apache Web服务器执行到新位置的内部重定向。内部意味着,客户端(浏览器)不会更改其地址栏中的URL,因为重定向不会与浏览器通信

因为这是一个重定向,POST请求被转换为GET请求

您可以通过查看以下两个
$\u服务器变量来了解这一点:

$_SERVER['REDIRECT_REQUEST_METHOD'] # POST
$_SERVER['REQUEST_METHOD'] # GET
因此,简而言之,您不能使用来对HTTP POST请求进行URL重写

您需要为此使用或创建自己的apache处理程序。

请在此处检查答案:

我用这个解决了我的问题


或将其放入.htaccess文件中:

RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /yourErrorDocument.php [L] 重新启动发动机 重写基/ 重写cond%{REQUEST_FILENAME}-F 重写cond%{REQUEST_FILENAME}-D 重写规则/yourErrorDocument.php[L]
使用
FallbackResource
指令代替Apache的
ErrorDocument
指令:它可以做到这一点

例如:

FallbackResource /404.php

这不是一个“把戏”,它只是一个可怕的解决方案。为什么不使用
mod_rewrite
?ps:不,在404重定向之后,您已经丢失了帖子数据,您无法获得它。不确定,但我认为您在重定向时会丢失所有帖子数据。你需要它做什么?也许有一些不同的方法请注意,没有像
404重定向这样的东西。4xx响应代码表示客户端错误(404表示客户端请求的资源在服务器上不存在),3xx代码用于重定向。如果您想强制客户机向新URI重新提交相同的POST请求,那么应该使用307状态代码。但我怀疑您实际上需要在这里使用的是
RewriteCond%{REQUEST\u FILENAME}-f
重写cond%{REQUEST_FILENAME}-d
将对不存在的文件的请求重写为特定脚本。我希望在用户请求不存在的页面时(不更改url地址栏中的url),根据post变量查看index.php的动态内容除非用户已提交表单,否则不应发送post请求,并且站点上的所有表单都应指向存在的资源。mod_rewrite将是您在这里想要的。谢谢,我在DaveRandom的想法的帮助下解决了这个问题:)Anways,也谢谢您的帮助:)如果您不需要获取post数据,这是最简单的方法。@JackFranzen:哦,还有一种方法没有这个答案中讨论的post限制。我没有工作-$\u服务器['REQUEST\u METHOD']和$\u POST都丢失了(PHP5.4.12)。这是我需要的解决方案。谢谢你提供。对于那些实现此解决方案的人来说,一个重要的注意事项是:必须按名称指定实际的文件。例如,在我的项目中,我以前将“errordocument403/router/”作为我的指令,但没有在末尾指定“index.php”。当我尝试“FallbackResource/router/”时,它失败了,直到我将其更改为“FallbackResource/router/index.php”。另请参阅这篇文章,这篇文章将为您节省一个小时的时间来调试为什么它对“/”的根端点不起作用: