我的.htaccess文件有一个规则:
RewriteRule ^submit index.php?task=submit [L]
这将引用索引.php?task=submit的站点上的链接重定向到/submit。
但是,我将信息发布到同一页面,以便最终URL如下所示:
index.php?task=submit&path=xyz&key=xyz.jpg&code=1234
由于发布方法的性质,我必须发布到index.php?task=submit。
如果用户手动输入扩展路径作为 url,是否有规则将重写 url?
听起来您正在寻找QSA
标志,它代表查询字符串追加。它将重写的查询字符串与传入的查询字符串组合在一起:
RewriteRule ^submit index.php?task=submit [L,QSA]
这意味着这...
/submit?path=xyz&key=xyz.jpg&code=1234
。将正确重写为:
index.php?task=submit&path=xyz&key=xyz.jpg&code=1234
由于发布方法的性质,我必须发布到index.php?task=submit。
这不是真的。您可以将表单指向/submit
而不会出现问题,如果它是 POST 表单。如果是 GET 表单,您将需要 [QSA] 标志,但仍然没有问题。
但是从您的评论中,我得出结论,您希望用户在地址栏中看到"/submit",但您的脚本可以访问其他 GET 变量。这行不通,看起来你误解了重写的概念:
您不是重写 index.php?task=submit
TO /submit
(如:神奇地向用户显示其他内容),而是重写 TO index.php?task=submit
/submit
(如:用户请求/submit
,此请求在内部重写为另一个请求)。
因此,如果原始请求不包含路径、键、代码的信息,则重写的请求也不能。但是您可以将它们存储在会话中,然后重定向到 PHP /submit
。
脚本的结构如下:
session_start();
if (isset($_GET['path'])) {
$_SESSION['path'] = $_GET['path'];
header('Location: http://' . $_SERVER['HTTP_HOST'] . '/submit');
session_write_close();
exit;
}
if (isset($_SESSION['path'])) {
$path = $_SESSION['path'];
unset($_SESSION['path']);
// do stuff with $path
}
这是否是一个合理的解决方案取决于此"提交"操作的作用。对于像搜索这样检索信息的东西,这可能是可以的,但对于存储信息的任何内容,POST/REDIRECT/GET 模式是更好的方法。