【问题标题】:How do I fix a malformed URL in PHP?如何在 PHP 中修复格式错误的 URL?
【发布时间】:2013-05-11 04:00:32
【问题描述】:

使用 PHP,如何自动修复格式错误的 url,如下所示:

/db/?param1=sas23456sdfd&param2=1368115104&parama3=more/resource
    or...
/db?param1=sas23456sdfd&param2=1368115104&parama3=more/resource

然后像这样重新排列成正确的顺序?:

/db/resource/?param1=sas23456sdfd&param2=1368115104&parama3=more
    or...
/db/resource?param1=sas23456sdfd&param2=1368115104&parama3=more

在您问之前,格式错误的 url 的原因完全超出了我的控制,这是由坚持在原始查询字符串参数之后愚蠢地添加尾部斜杠和更多端点的客户端库引起的。幸运的是,我通过 PHP 反向代理脚本传递请求,因此可以想象我可以修复它。请注意:

  1. 查询字符串可能存在也可能不存在
  2. 有时可能会正确放置查询字符串
  3. 查询字符串参数名称和值会有所不同
  4. 查询字符串参数的数量可能会发生变化
  5. 查询字符串可能并不总是跟在“/”之后(db/?param=val 或 db?param=val)
  6. 格式错误的 URL 将始终具有“?param(s)=value/”模式

关于如何用 PHP 解决这个混乱的任何想法?

【问题讨论】:

  • 有没有要求他们更换客户端库?我可以看到修补程序无济于事。
  • 我希望.. 现在不是一个选项。
  • 你可以使用 preg_split('/[\/ \?]/', $malformedURL);而不是使用一些逻辑来重新排列..
  • 最好修复网址,而不是解决格式错误的症状。

标签: php regex apache


【解决方案1】:

替换或修复客户端库可能更容易/更好,因为它没有做它应该做的事情(或者它是为不同的规范设计的)。

但是有一个正则表达式可以帮助你。

/(.*?)(\/)?(\?.*)(\/.*)/

这匹配示例中的格式错误的字符串,而不匹配结果字符串。在Rubular 上查看工作演示。

您可以这样使用它(虽然我不确定这是否是处理它的最佳方式,但我宁愿修复输出然后尝试处理损坏的输入):

$matches = array();
$is_malformed = preg_match('/(.*?)(\/)?(\?.*)(\/.*)/', $_SERVER['REQUEST_URI'], $matches);
if($is_malformed) {
    $_SERVER['REQUEST_URI'] = $matches[1] . $matches[4] . $matches[2] . $matches[3];
}

【讨论】:

  • 非常感谢我发布的可能答案。如果您有任何改进,请查看并告诉我。
【解决方案2】:

我在另一个question 中更笼统地解决了这个问题,并在@Yogesh Suthar 的帮助下提出了一个可行的解决方案(欢迎改进):

$qs_match = array();
$is_malformed = preg_match('$\?(.*?)\/$s', $_SERVER['REQUEST_URI'], $qs_match);
if($is_malformed) {
    $uri_parts = explode('?',$_SERVER['REQUEST_URI']); //break apart at the first query string param
    //per https://stackoverflow.com/questions/4250794/simple-php-regex-question
    $_SERVER['REQUEST_URI'] = $uri_parts[0].preg_replace('/^[^\/]*\//' , '/', $uri_parts[1]).'?'.$qs_match[1]; //recombined but modified part 2
}

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2014-01-19
    • 1970-01-01
    相关资源
    最近更新 更多