jjzjj

php - file_exists 或 getimagesize 仅适用于本地绝对文件路径,但不适用于 PHP 中的 URL

coder 2024-04-07 原文

我最近更新了我的一台服务器,从那时起,我遇到了一些特定 PHP 命令的问题(见下文)。我相信这是一个配置问题,但我已经调查了几件事并且不知道更多。所以也许你们中的一个人有一个好主意:

我使用以下代码来显示内部网站上的标准 Logo 或用户定义的 Logo :

if(L_HEADER) {
  $logo = L_HEADER;
}
else {
  $logo = 'logo.png';
}
$properties = getimagesize(CONFIG_URL . 'images/' . $logo)

L_HEADER 和 CONFIG_URL 是具有预定义值的常量(另一个文件):

  1. L_HEADER 包含“opb_beta.png”
  2. CONFIG_URL 包含“http://billing.intranet.opb/

连接工作正常,Apache 日志文件的错误消息也证实了这一点:

PHP Warning: getimagesize(http://billing.intranet.opb/images/opb_beta.png): failed to open stream: HTTP request failed! HTTP/1.1 404 NOT FOUND
in /var/www/billing/templates/header.inc.php on line 42

所以第一个显而易见的结论是:路径是错误的。但事实并非如此,相信我。我检查了 1.000 次。事实上,第一个好奇是图像在同一文件的代码中被正确显示和引用了几行:

echo '<img src="' . CONFIG_URL . 'images/' . $logo . '"  
  width="' . $properties[0] . '" height = "' . $properties[1] . '" />";

正如我得到上面提到的错误,高度和宽度是“0”,但是查看源代码,URL 没问题,手动访问它打开图像,当用手动值替换宽度和高度时,图像是显示得很好。

更好奇的是(还有我现在的 finx),当将 getimagesize 更改为以下内容时,它工作得很好:

$properties = getimagesize($_SERVER['DOCUMENT_ROOT'] . /public_html/images/' . $logo);

我会提到我正在使用 Apache 的重定向;这就是为什么在 URL 中看不到“public_html”,而在第二个示例的绝对路径中却看到它的原因。

“file_exists”也是如此。 URL 不起作用,同一文件的绝对本地路径起作用。

另一个好奇心:在另一段代码中,我正在在线检查更新。在那里,我使用带有 file_exists 和 fopen 的“真实”公共(public) URL。我看起来像这样并且工作得很好:

if(file_exists('http://desk.co.cr/df_stable.txt') {
  if(($handle = fopen('http://desk.co.cr/df_stable.txt', 'r')) !== FALSE) {
    // some other code
  }
}

现在,我已经检查过的东西:

  • 正确设置了整个路径的文件权限,www-data 是所有文件的组和所有者以及图像文件的读写权限
  • allow_url_fopen 设置为“开启”。
  • open_basedir 设置为“无值”并且 Apache 的虚拟主机定义中没有覆盖。
  • 文件确实存在且语法和路径正确。

一些背景信息:

  • 服务器在 Ubuntu 14.04 LTS 上运行
  • Apache 2.4.7
  • PHP 5.5.9

目前,我没有想法。

最佳答案

隐藏在您的问题中的是您已经找到的重要线索:

Another curiosity: in another piece of code, I am checking online for updates. There, I am using a "real", public URL

因此,失败的 URL 是非公共(public)域,您的 PC 已配置为查找正确的 IP 地址。这很可能是通过运行本地 DNS 服务器或配置 PC 的“主机”文件以硬编码该域的地址来完成的。

然而,当您从服务器本身请求 URL 时,一个完全不同的 DNS 配置在起作用,所以它可能根本不知道该服务器在哪里 - 即使它是它自己!您需要配置服务器的 DNS 设置或 /etc/hosts 以匹配您 PC 上的设置。

一个相关的可能性是服务器配置了相同的地址查找,但路由器不允许它以这种方式连接到自身。一种解决方法是将主机文件条目指向 127.0.0.1 并配置 Apache 以匹配。

如果您可以在服务器上获得命令行,您可以尝试:

nslookup billing.intranet.opb
# if that returns the right IP address, see if it's reachable:
ping billing.intranet.opb
# and if it's the right server, it will be listening on port 80:
telnet billing.intranet.opb 80
# telnet will either time out, or connect and give you a prompt

如果 telnet 连接,您甚至可以手动编写一个 HTTP 请求(一个空行完成请求;不要输入太长时间,否则服务器将退出)例如:

HTTP/1.1 HEAD /
Host: billing.intranet.opb

关于php - file_exists 或 getimagesize 仅适用于本地绝对文件路径,但不适用于 PHP 中的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619282/

有关php - file_exists 或 getimagesize 仅适用于本地绝对文件路径,但不适用于 PHP 中的 URL的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  3. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  8. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  9. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  10. ruby - __FILE__ == $PROGRAM_NAME 在 ruby​​ 中是什么意思? - 2

    这个问题在这里已经有了答案:Whatdoes`if__FILE__==$0`meaninRuby(6个答案)关闭6年前。我在审查Ruby代码时偶然发现了这个语法。代码是:if__FILE__==$PROGRAM_NAME#somecode...end我想__FILE__是一个变量,可以让我获取我所在文件的名称?但是$PROGRAM_NAME简化了什么?另外,为什么这个if语句是必需的,因为程序可以使用或不使用它?

随机推荐