Stack Overflow等网站如何使用action="/questions/ask/submit"
提交表单?
我以为mod_rewrite
会失去$_POST
变量?
.htaccess文件系统
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L]
索引.php
$q = explode("/", $_SERVER['REQUEST_URI']);
if($q[1]!=""){
switch($q[1]){
case "test":
include("test.php");
break;
...
测试.php
<?php
if(isset($_POST["submitButton"])){
echo "Submitted";
}
else{
echo "Not submitted";
}
?>
<form method="post" action="/test/submit">
<input type="submit" name="submitButton">
</form>
如果我删除action="/test/submit"
如果我的URL是/test
,那么当我单击该按钮时,它将返回Not submitted
。
如果我的URL是/test.php
,那么当我单击该按钮时,它将返回Submitted
。
更新
目前,我使用以下代码。
索引.php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
$q = explode("/", $_POST["url"]);
}
else{
$q = explode("/", $_SERVER['REQUEST_URI']);
}
...
测试.php
<form method="post" action="/">
<input type="hidden" name="url" value="/test">
...
这允许我的test.php接收post变量。
如果用户没有错误,我使用header("Location: test/success");
如果有错误,URL必须是/
,这不是理想的。
更新/解决方案
问题可能出在Apache 2.4中。修复方法是在index.php中添加以下行:
parse_str(file_get_contents("php://input"),$_POST);
使用这种方法,不需要任何action="..."
(即使URL是一个slug,它也会成功地POST到自己)。
2条答案
按热度按时间l7mqbcuq1#
/questions/ask/submit
可能是由CMS控制的。这意味着大多数请求被重定向到一个文件,然后由它来解释它们。这个重定向通常是用mod_rewrite完成的,正如你的问题所指出的。mod_rewrite接受一些“开关”来告诉它该做什么。也就是说,mod_rewrite“弄乱”$_POST
数据没有已知的错误。Apache将这些数据传递给PHP。mod_rewrite将这些数据传递给Apache。如果您的$_POST
数据被弄乱,你在某些地方有个坏规矩。下面是一个常见的CMS WordPress的例子,它将所有的流量,不管是哪种方法,都定向到一个中央控制器,然后中央控制器解释完整的
$_POST
数据:自上而下说明:
/
index.php
,则强制mod_rewrite不处理更多规则并加载index.phpEDIT(在提交有问题的示例文件后)
这是我的完整文件。有了这些文件,在Apache 2. 2和PHP 5. 4安装上,这可以完美地工作。
.htaccess文件系统
索引.php
测试.php
目录列表,以便比较权限
注意:*apache以nobody身份运行。nobody在我的测试机器上 *
如果这对你不起作用,你可能有一个权限问题。
bgibtngc2#
mod_rewrite不影响post变量。