2013-12-22 89 views
1

Stack Overflow等网站如何使用action="https://stackoverflow.com/questions/ask/submit"提交表单?如果使用mod_rewrite,使用POST发送的变量会发送到PHP吗?

我以为mod_rewrite会失去$_POST变量?

的.htaccess

​​

的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变量。

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

如果有错误,则URL将不得不/这是不理想的。

更新/解析

问题可能出在Apache 2.4上。此修复程序是该行添加到index.php文件:

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

使用这种方法,没有必要对任何action="..."(这将成功发布到自身,即使URL是蛞蝓)。

+2

只需尝试一下,找出答案。 – Mike

+0

我有。 'mod_rewrite'失去'$ _POST'变量。 – rybo111

+1

POST变量在内部重定向上继续传递,但不是301s等。但是,如果需要,我相当确信您可以这样做。 –

回答

1

mod_rewrite不影响后期变量。

+0

如果[R]是mod_rewrite规则的修饰符,则会出错。 – virmaior

+2

我的不好,但今天谁使用这个修饰符,如果我们正在谈论重写到index.php? –

+0

Touche。这不在他的mod_rewrite中。 – virmaior

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的,如何将所有流量,无论方法的,到中央控制器,该控制器然后解释untarnished $_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说明:

  • 只有mod_rewrite的模块被激活
  • 打开重写引擎执行这一点,所以它接受你的新规则
  • 让所有的重写,重写文档根/
  • 如果请求是直接index.php然后强制mod_rewrite的不处理更多的规则和负载的index.php
  • 如果请求的URL不直接映射到一个文件
  • ,如果请求的URL没有照片直接映射到一个目录
  • 发送的所有数据,包括请求的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> 

目录列表,这样你可以比较权限

注:我的测试机

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 

如果这不适合你的运行Apache nobody.nobody,你可能有权限问题。这个确切的代码工作。

+0

我已经复制了你的WordPress htaccess示例,并且在使用和不使用'action =“test/submit”'的情况下发布,它仍然不会发布变量。 – rybo111

+0

再次编辑,添加一个确切的工作示例,基于您的粘贴文件 – loushou

+0

+1。如果确切的代码起作用,那么你是对的,它必须是一个许可(或服务器?)问题。我已经用我暂时使用的解决方法更新了我的问题。 – rybo111