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)。
答案 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:
/
index.php
,则强制mod_rewrite不处理更多规则并加载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不会影响帖子变量。