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

h9vpoimq  于 2022-11-16  发布在  PHP
关注(0)|答案(2)|浏览(163)

Stack Overflow等网站如何使用action="/questions/ask/submit"提交表单?
我以为mod_rewrite会失去$_POST变量?

.htaccess文件系统

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

索引.php

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

测试.php

  1. <?php
  2. if(isset($_POST["submitButton"])){
  3. echo "Submitted";
  4. }
  5. else{
  6. echo "Not submitted";
  7. }
  8. ?>
  9. <form method="post" action="/test/submit">
  10. <input type="submit" name="submitButton">
  11. </form>

如果我删除action="/test/submit"

如果我的URL是/test,那么当我单击该按钮时,它将返回Not submitted
如果我的URL是/test.php,那么当我单击该按钮时,它将返回Submitted

更新

目前,我使用以下代码。

索引.php

  1. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  2. $q = explode("/", $_POST["url"]);
  3. }
  4. else{
  5. $q = explode("/", $_SERVER['REQUEST_URI']);
  6. }
  7. ...

测试.php

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

这允许我的test.php接收post变量。
如果用户没有错误,我使用header("Location: test/success");
如果有错误,URL必须是/,这不是理想的。

更新/解决方案

问题可能出在Apache 2.4中。修复方法是在index.php中添加以下行:

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

使用这种方法,不需要任何action="..."(即使URL是一个slug,它也会成功地POST到自己)。

l7mqbcuq

l7mqbcuq1#

/questions/ask/submit可能是由CMS控制的。这意味着大多数请求被重定向到一个文件,然后由它来解释它们。这个重定向通常是用mod_rewrite完成的,正如你的问题所指出的。mod_rewrite接受一些“开关”来告诉它该做什么。也就是说,mod_rewrite“弄乱”$_POST数据没有已知的错误。Apache将这些数据传递给PHP。mod_rewrite将这些数据传递给Apache。如果您的$_POST数据被弄乱,你在某些地方有个坏规矩。
下面是一个常见的CMS WordPress的例子,它将所有的流量,不管是哪种方法,都定向到一个中央控制器,然后中央控制器解释完整的$_POST数据:

  1. # BEGIN WordPress
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteRule ^index\.php$ - [L]
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteRule . /index.php [L]
  9. </IfModule>
  10. # END WordPress

自上而下说明:

  • 仅在mod_rewrite模块处于活动状态时执行此命令
  • 打开重写引擎,使其接受新规则
  • 进行所有重写,重写到文档根目录/
  • 如果请求直接发送到index.php,则强制mod_rewrite不处理更多规则并加载index.php
  • 如果所请求的URL没有直接Map到文件
  • 如果请求的url没有直接Map到目录
  • 将所有数据,包括请求的url、_GET、_POST等发送到index.php,并且不处理任何其他规则
    EDIT(在提交有问题的示例文件后)

这是我的完整文件。有了这些文件,在Apache 2. 2和PHP 5. 4安装上,这可以完美地工作。

.htaccess文件系统

  1. # BEGIN WordPress
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteRule ^index\.php$ - [L]
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteRule . /index.php [L]
  9. </IfModule>
  10. # END WordPress

索引.php

  1. <?php
  2. $q = explode("/", $_SERVER['REQUEST_URI']);
  3. if($q[1]!=""){
  4. switch($q[1]){
  5. case "test":
  6. include("test.php");
  7. break;
  8. }
  9. }

测试.php

  1. <?php
  2. if(isset($_POST["submitButton"])){
  3. echo "Submitted";
  4. }else{
  5. echo "Not submitted";
  6. }
  7. ?>
  8. <form method="post" action="/test/submit">
  9. <input type="submit" name="submitButton">
  10. </form>

目录列表,以便比较权限

注意:*apache以nobody身份运行。nobody在我的测试机器上 *

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

如果这对你不起作用,你可能有一个权限问题。

展开查看全部
bgibtngc

bgibtngc2#

mod_rewrite不影响post变量。

相关问题