【问题标题】:@fopen in PHP does not support relative URLsPHP 中的 @fopen 不支持相对 URL
【发布时间】:2012-05-30 10:43:58
【问题描述】:

为什么 PHP 不支持相对 URL?

这可以用其他编程语言来完成吗?那个服务器端可以微快速检测吗?

$urla="http://cdn.domain.net";
$urlb="//cdn.domain.net";

if(@fopen($urla,"r")){
// I work
}

if(@fopen($urlb,"r")){
// I do not work
}

既然我提到了它,许多主要的 PHP 不能像这样工作,或者不支持,因为我猜是由于服务器端 - 也许 C 库中需要修改 CORE PHP? (What is a Relative URL?)

【问题讨论】:

  • 一个人可以做梦不能他..虽然这是一个小问题..它也对我有帮助..你需要修改C文件..

标签: php url fopen relative-path


【解决方案1】:

为什么 PHP 不支持相对 URL?

因为它没有一个相对的基本 URL(尽管一个可以从请求 URI 中计算出来……但仅适用于由 HTTP 请求触发的 PHP 脚本)。

...如果它支持 fopen 中的相对 URI,那么它就不能支持相对文件路径,因为它们无法区分。

【讨论】:

  • 我不同意你的不同意见
  • Quentin 在他的声明中是正确的,协议相关 url 仅在浏览器中有效。 (您甚至在 html 邮件中遇到问题......至少 Outlook 不知道如何处理它并认为它是网络路径。)
  • @Rufinus — 电子邮件通常通过 IMAP、POP 或 Exchange 获取,而不是 HTTP 或 HTTPS,因此方案相对 URI 在那里没有意义。
  • quentin... 你知道 HTML 邮件是什么意思,不是吗:-)
  • @Rufinus — 通过 SMTP 传送到收件人的邮件服务器,他们使用 IMAP、POP3、Microsoft 的专有 Exchange 协议或 Lotus 对 Notes 和 Domino 所做的任何事情从中获取邮件。 (他们也可能使用网络邮件服务(在这种情况下,他们将使用 HTTP(s)),但如果他们使用 Outlook,则不会)。
【解决方案2】:

为什么 PHP 不支持相对 URL?

相对 URL 支持需要一个相对 URL 相对的基本 URL。请参阅4.2. Relative Reference in RFC 3986 URI Generic Syntax

考虑到这一点,有一个可用的 PHP 库实际上确实支持相对 URL,并且它与 fopen 兼容。它叫Net_URL2

require_once('Net/URL2.php'); # or configure your autoloader

$baseUrl = 'http://cdn.domain.net';

$hrefRelativeOrAbsolute = '//cdn.domain.net';

$baseUrl = new Net_URL2($baseUrl);

$urlAbsolute = (string) $baseUrl->resolve($hrefRelativeOrAbsolute);

另见problem with adding root path using php domdocument

【讨论】:

  • @Quentin 回答问题。您为此提供了解决方案。把你们俩都翻了。非常感谢。
【解决方案3】:

此功能所需的 url 中的协议指示,它是一种语言结构,指示包装器,与链接中的示例不同。

为什么需要它以及如何使用可以在php文档php wrappers中找到

【讨论】:

  • 它在哪里告诉你为什么需要它?我在主要内容中看不到它。它是页面上众多用户贡献之一吗?直接链接到相关链接将不胜感激。
  • 函数的逻辑可以理解。 fopen()、copy()、file_exists()、filesize()等文件系统函数调用wrapper做一些事情,没有wrapper就不行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2015-03-31
  • 2018-04-23
  • 1970-01-01
  • 2010-12-29
  • 2011-05-04
  • 1970-01-01
相关资源
最近更新 更多