2013-12-22 92 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