如果使用mod_rewrite,使用POST发送的变量是否会发送到PHP?

时间:2013-12-22 01:25:04

标签: php apache .htaccess mod-rewrite

Stack Overflow等网站如何使用action="/questions/ask/submit"提交表单?

我原以为mod_rewrite会失去$_POST vars?

的.htaccess

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L]

的index.php

$q = explode("/", $_SERVER['REQUEST_URI']);
if($q[1]!=""){
  switch($q[1]){
    case "test":
      include("test.php");
      break;
      ...

test.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"

如果我的网址为/test,则点按该按钮后会返回Not submitted 如果我的网址为/test.php,则点按该按钮时会返回Submitted


更新

目前,我正在使用以下内容。

的index.php

if($_SERVER['REQUEST_METHOD'] == 'POST'){
  $q = explode("/", $_POST["url"]);
}
else{
  $q = explode("/", $_SERVER['REQUEST_URI']);
}
...

test.php的

<form method="post" action="/">
  <input type="hidden" name="url" value="/test">
  ...

这允许我的test.php接收post vars。

如果用户没有错误,我会使用header("Location: test/success");

如果有错误,则网址必须为/,这是不理想的。

更新/分辨率

问题可能出在Apache 2.4上。修复是将此行添加到index.php:

parse_str(file_get_contents("php://input"),$_POST);

使用这种方法,不需要任何action="..."(这将成功POST到自身,即使URL是slug)。

2 个答案:

答案 0 :(得分:3)

action是表单的目标。 method是提交类型。 method将决定是否填充$_POST$_GET

修改

在投票结束后,对问题进行了一些更改,似乎这个回答并不是提问者所要求的。

/questions/ask/submit可能由CMS控制。意味着大多数请求被重定向到单个文件,然后解释它们。正如您的问题所示,这种重定向通常是使用mod_rewrite完成的。 mod_rewrite接受许多“开关”来告诉它该做什么。话虽如此,mod_rewrite“弄乱”$_POST数据并不存在已知错误。 Apache将这些数据传递给PHP。 mod_rewrite将其传递给Apache。如果您的$_POST数据搞砸了,那么您的某些地方就会出现错误的规则。

以下是一个示例,说明了常见的CMS,WordPress如何将所有流量(无论方法如何)引导到中央控制器,中央控制器然后解释未经修饰的$_POST数据:

# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.php$ - [L] 
  RewriteCond %{REQUEST_FILENAME} !-f 
  RewriteCond %{REQUEST_FILENAME} !-d 
  RewriteRule . /index.php [L] 
</IfModule>
# END WordPress

TOP DOWN EXPLANATION:

  • 仅在mod_rewrite模块处于活动状态时执行此操作
  • 启用重写引擎,以便接受新规则
  • 进行所有重写,重写到文档根/
  • 如果请求直接发送到index.php,则强制mod_rewrite不处理更多规则并加载index.php
  • 如果请求的网址未直接映射到文件
  • 如果请求的网址没有直接映射到目录
  • 将所有数据(包括请求的url,_GET,_POST等)发送到index.php,并且不处理任何其他规则

编辑(提交样本文件后)

这是我的完整档案。使用这些确切的文件,在Apache 2.2和PHP 5.4安装上,这非常有效。

<强>的.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>
# END WordPress

<强>的index.php

<?php
$q = explode("/", $_SERVER['REQUEST_URI']);
if($q[1]!=""){
  switch($q[1]){
    case "test":
      include("test.php");
    break;
  }   
}   

<强> test.php的

<?php
  if(isset($_POST["submitButton"])){
    echo "Submitted";
  }else{
    echo "Not submitted";
  }
?>
<form method="post" action="/test/submit">
  <input type="submit" name="submitButton">
</form>

目录列表,因此您可以比较权限

注意: apache在我的测试计算机上运行为nobody.nobody

drwxrwxr-x 2 nobody git 4096 Dec 22 03:34 ./
drwxrwxr-x 3 nobody git 4096 Dec 22 03:26 ../
-rw-rw-r-- 1 nobody git  244 Dec 22 03:29 .htaccess
-rw-rw-r-- 1 nobody git  134 Dec 22 03:27 index.php
-rw-rw-r-- 1 nobody git  194 Dec 22 03:28 test.php

如果这对您不起作用,则可能存在权限问题。这个确切的代码有效。

答案 1 :(得分:1)

mod_rewrite不会影响帖子变量。