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

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

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到自己)。

l7mqbcuq

l7mqbcuq1#

/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

自上而下说明:

  • 仅在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文件系统

# 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

索引.php

<?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>

目录列表,以便比较权限

注意:*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

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

bgibtngc

bgibtngc2#

mod_rewrite不影响post变量。

相关问题