A有一个删除链接进入另一个页面,调用一个函数,如果该函数成功,那么我将用户发送回他们点击删除的页面。
我用这个回去:
if ($booking->deleteBooking($_GET['id']))
{
header('Location: ' . $_SERVER['HTTP_REFERER']);
}
我的链接看起来像这样:
/calendar.php?id=1&month=04&day=25&year=2014&t=11&v=true&f=true&reserved=true
我可以修剪链接并在发回时删除&reserved=true
吗?
答案 0 :(得分:4)
我建议您使用PHP URL functions来解析HTTP_REFERER
标头并相应地调整它,而不是执行可能容易出错的字符串操作:
// parse the referrer
$referer = parse_url($_SERVER['HTTP_REFERER']);
// parse the querystring part
parse_str($referer['query'], $querystring);
// unset the reserved parameter (only if value is 'true'?)
if ($querystring['reserved'] === 'true') unset($querystring['reserved']);
// reconstruct the revised querystring
$referer['query'] = http_build_query($querystring);
// redirect to the adjusted URL
header('Location: ' . http_build_url($referer));
答案 1 :(得分:3)
我建议您避免使用正则表达式和str_replace,因为当您的网址结构发生变化时,它们会很快变平。
我现在把它放在一个班级,因为这不是你最后一次需要这样做(我上周必须这样做)或其他一些与URL有关的事情。因此,您应该继续将功能封装在一个地方而不是以后。如果您找到更好或更正确的方法来处理任务,您可以随后在一个地方中更改实施。
关于您的脚本和可能的解决方案的一些相当重要的警告...
无法真正依赖HTTP_REFERER。浏览器不需要发送它,许多不需要。您可以通过在查询字符串中自行发送URL(正确转义)或可能通过隐藏的表单字段来解决这个问题。否则,您的重定向和脚本将在很多情况下失败!见HTTP Referer not always being passed
如果你想立即重定向,你应该总是在发送位置标题后退出...否则你的脚本将继续愉快地做事。 (数据库查询等等)为此,我将封装您的重定向代码,并在我的示例解决方案中完成。
http_build_url在PHP中默认不可用。这是一个pecl_http的事情。最终,在这种情况下并不是真的需要,我的示例解决方案可以在没有它的情况下工作。
示例类使用:
$referrer = 'http://example.com/calendar.php?id=1&month=04&day=25&year=2014&t=11&v=true&f=true&reserved=true';
$url = new URL($referrer);
$url->remove_param('reserved');
$url->redirect();
类代码:
class URL
{
public $url = '';
function __construct ($url)
{
$this->url = $url;
}
function redirect ($response_code = 301)
{
header('Location: ' . $this->url, true, $response_code);
exit;
}
function remove_param ($param)
{
// Do nothing to URL without a Query String (hat tip @eggyal)
if (strpos($this->url, '?') === false) return $this->url;
// Split URL into base URL and Query String
list($url, $query) = explode('?', $this->url, 2);
// Parse Query String into array
parse_str($query, $params);
// Remove the parameter in question
unset($params[$param]);
// Rebuild Query String
$query = http_build_query($params);
// Piece URL back together and save to object
$this->url = $url . ($query ? "?$query" : '');
// Return URL in case developer really just wants an instant result
return $this->url;
}
}
警告:这不会保留任何URL片段(即#fragment)在HTTP_REFERER的情况下,这应该无关紧要,因为大多数浏览器无论如何都不会发送它。如果这是您认为需要的功能,那么可以在以后轻松编码。
命名空间:为简单起见,代码示例不是命名空间。但是,对于现实生活实现,我建议养成使用“命名空间应用程序”的习惯。在任何内部类文件的顶部,并将类称为“new App \ Class();”特别是如果您正在使用或可能在项目中使用任何第三方代码。
性能提示:在成为问题之前不要担心性能......你的时间总是最大的瓶颈......而不是PHP。珍惜你的时间超过PHP的时间! PHP 总是比花时间复制面食编码更快。封装您的代码(在类或函数中),并留出时间去外面享受现在和未来需要重新分解时的天气。
答案 2 :(得分:0)
使用preg_replace
preg_replace('/^&reserved=true/', '', $_SERVER['HTTP_REFERER']);