如何在纯 PHP 中执行 HTTP 重定向后获取最终 URL?

2024-03-14

我想做的是找出重定向后的最后/最终 URL 是什么.

我不想使用 cURL。我想坚持使用纯 PHP(流包装器)。

现在我有一个网址(比方说http://域名.test http://domain.test),我使用 get_headers() 从该页面获取特定的标题。 get_headers 也会返回多个Location:标题(参见Edit以下)。有没有办法使用这些标头来构建最终 URL?或者有没有一个 PHP 函数可以自动执行此操作?

Edit:get_headers() 遵循重定向并返回每个响应/重定向的所有标头,因此我拥有所有Location:标头。


function getRedirectUrl ($url) {
    stream_context_set_default(array(
        'http' => array(
            'method' => 'HEAD'
        )
    ));
    $headers = get_headers($url, 1);
    if ($headers !== false && isset($headers['Location'])) {
        return $headers['Location'];
    }
    return false;
}

此外...

正如评论中提到的,final项目在$headers['Location']将是所有重定向后的最终 URL。但值得注意的是,它不会always是一个数组。有时它只是一个普通的非数组变量。在这种情况下,尝试访问最后一个数组元素很可能会返回单个字符。不理想。

如果您只对最终 URL 感兴趣,在所有重定向之后,我建议更改

return $headers['Location'];

to

return is_array($headers['Location']) ? array_pop($headers['Location']) : $headers['Location'];

...这只是如果速记 https://davidwalsh.name/php-ternary-examples for

if(is_array($headers['Location'])){
     return array_pop($headers['Location']);
}else{
     return $headers['Location'];
}

此修复将处理任一情况(数组、非数组),并且无需在调用函数后清除最终 URL。

在没有重定向的情况下,该函数将返回false。同样,该函数也会返回false无效 URL(因任何原因无效)。因此,重要的是检查 URL 的有效性 https://stackoverflow.com/questions/2280394/how-can-i-check-if-a-url-exists-via-php?#answer-12628971 before运行此函数,或者将重定向检查合并到您的验证中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在纯 PHP 中执行 HTTP 重定向后获取最终 URL? 的相关文章

  • DOMDocument::save[domdocument.save]:无法打开流:权限被拒绝

    我有一个代码可以将 XML 文件保存到我的目录中 它实际上在我的本地主机和我的共享主机中就像一个魅力 但它在我的 Linux VPS 中不起作用 我总是收到这个错误 警告 DOMDocument save home admin xxxxxx
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • yii2 更新后返回上一页

    更新记录后如何将用户重定向到上一页 这是典型的场景 用户在索引页面中过滤结果或对记录进行分页 然后找到想要编辑的记录并单击编辑按钮 他们更新该记录的数据 一旦单击 更新 按钮 他们将被重定向到索引视图 但具有先前选择的过滤器 页面 更新后我
  • PHP 内部:TSRMLS_FETCH 如何工作?

    PHP 内部结构是怎样的TSRMLS FETCH宏发挥作用吗 Per the PHP手册 http php net manual en internals2 memory tsrm php 在开发扩展时 包含 tsrm ls is unde
  • 如何在加载ajax内容和javascript时加载gif图像[重复]

    这个问题在这里已经有答案了 我一直在尝试加载 gif 图像 直到 ajax 加载数据并显示它 但我对此感到安慰 我希望你能帮助我 这是我的高级搜索代码 现在我想为此添加加载 gif ajax type POST url base rul s
  • 在 Python 中发送 100,000 个 HTTP 请求的最快方法是什么?

    我正在打开一个包含 100 000 个 URL 的文件 我需要向每个 URL 发送 HTTP 请求并打印状态代码 我正在使用 Python 2 6 到目前为止 我已经了解了 Python 实现线程 并发的许多令人困惑的方式 我什至看过蟒蛇一
  • 如何在 PHP 中通过 array_map(...) 使用数组的数组? [复制]

    这个问题在这里已经有答案了 PHP 函数array map http php net manual en function array map php期望回调作为第一个参数 或null for 创建数组的数组 http php net ma
  • PHP json_encode 反斜杠和数组名称的问题

    我正在将一些 postgresql 数据转换为 PHP json encode 但我遇到了一些问题 json encode 将 BackSlash 添加到我的数据中的所有斜杠中 在描述中出现段落标记的结束 我认为是因为反斜杠问题 我不希望我
  • IFormFile 未由 dropzone uploadMultiple 请求填充

    我遇到的问题是 IFormFile 列表没有填充给定的文件 但是当我调用 HttpContext Request Form Files 时然后我就可以访问这些文件了 我更喜欢使用 IFormFile 因为它似乎是新的 Dotnet core
  • AngularJS 忽略一些标头

    我正在玩一点 Angular 遇到了一个小问题 我正在尝试为http响应设置一个自定义标头 然后在角度方面读取它的值 标头已设置 我确信这一点 因为 chrome 的调试工具确认了 这意味着服务器端没问题 到目前为止 一切都很好 当我尝试通
  • 如何垂直打印数组中的字符串元素? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个数组 我想垂直打印每个元素 例如 myArr abc def ghi 输出应该是 a d g b e h c f
  • 搜索多个表 (SQL)

    我需要能够有一个 SQL 查询来使用简单的搜索来搜索我的数据库 这是我的表格现在的样子 Table artists id name Table albums id artistID name Table songs id albumID n
  • 如何从页面获取所有网址(php)

    我有一个页面 其中的网址和描述逐一列出 例如书签 网站列表 如何使用php从该页面获取所有url并将它们写入txt文件 每行一个 只有url而没有描述 页面如下所示 一些描述 http link com 其他说明 http link2 co
  • 如何在Redis中正确存储图片?

    决定将图像存储在Redis中 如何正确执行 现在我这样做 redis gt set image path here is the base64 image code 我不确定这是否正常 将图片存储在Redis中是完全可以的 Redis 键和
  • xampp openssl 调用 openssl_pkey_new() 时出错;

    所以我试图让 openssl 在我的 Windows 安装的 xampp 1 7 3 上工作 它是用 OpenSSL 0 9 8l 构建的 这只是我第二次在 amp 安装上安装 openssl 但第一次进展顺利 这是在同一台机器上的 wam
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • PHP runkit_function_rename 不起作用?

    这段代码不起作用 为什么不 我真正想要的是这个 我正在使用一个具有功能的系统 当我在本地主机上时 我希望该函数做一些不同的事情 我想用自己的东西覆盖该函数 也欢迎所有替代方案 您是否安装了 PECL 扩展 http www php net
  • 限制传出 PHP+curl 请求的速率

    有没有办法限制 有延迟 向外部服务器发出 PHP curl 请求的速率 以便每秒只有 n 个请求 PHP 在 Fastcgi 模式下使用 因此无法使用睡眠 是的 有curl 多重处理程序 您可以使用 OOP 方式以 OOP 方式完成此操作这
  • 如何检查文件是否为php?

    我想检查文件是否具有扩展名 php 如果有的话我会把它包括在内 有人可以帮我进行正则表达式检查吗 thanks 通常您不使用正则表达式 以下是一种流行的方法 extension pathinfo filename PATHINFO EXTE
  • Jpgraph:如何在php中设置组条形柱形图的标签

    这是我的 jpgraph 演示代码

随机推荐