我从一个本地托管的网站调用内容,以便在另一个本地托管的网站上使用。 (这是为了复制我将从中提供静态内容的无Cookie网址。)
我在Windows 8.1上使用当前版本的XAMPP(5.6.12)和PHP版本5.6.12以及Apache 2.4.16(Win32)。
这两个站点(均来自\ xampp \ htdocs目录)是MAIN和STATIC,并且在httpd-vhosts.conf文件以及Windows主机文件中进行了适当配置。因此,它们各自都可以工作,每个都可以从另一个中检索内容(下面将说明重要的例外情况)。
在STATIC中有一个名为IMAGES的子目录,其中包含MY.JPG;因此,当XAMPP运行时,它的本地URL是STATIC / IMAGES / MY.JPG,它会显示。
在我的MAIN本地域的文件中,我可以通过在域名前加两个正斜杠(例如//STATIC/IMAGES/MY.JPG)来引用STATIC本地域上的内容。事实上,我的STATIC域的INDEX.PHP中的代码实际上将检索并显示JPG:
<img style="display: inline;" src="//STATIC/IMAGES/MY.JPG" />
没问题。但是,当我将该路径传递给getimagesize()或其他PHP运算符时,如下所示:
$resource = "//STATIC/IMAGES/MY.JPG";
$getimagesize = getimagesize($resource);
...我收到这样的消息:
警告:getimagesize(// tmb-static / images / my.jpg):无法打开 stream:第11行的C:\ xampp \ htdocs \ MAIN \ INDEX.PHP中的权限被拒绝
在阅读了其他人遇到的类似问题后,我检查确保为我试图打开的文件夹设置了正确的权限。为了确定我在本地执行此代码时当前用户是谁,我跑了:
$current_user = get_current_user();
print_r("current_user = " . $current_user . "\n");
...它显示当前用户是SYSTEM。
然后我做了其他地方的建议,即通过遵循共享文件夹和设置权限的相应步骤,为STATIC文件夹及其子文件夹提供对SYSTEM的完整读取,写入和所有其他访问。我这样做不仅适用于SYSTEM,也适用于所有人,以防万一。
可悲的是,getimagesize()和类似的运营商抛出相同的&#34;未能打开流:权限被拒绝&#34;然后,当我运行代码时,即使可以使用简单的HTML检索和显示图像本身:
// This works and displays the retrieved image:
echo '<img style="display: inline;" src="//STATIC/IMAGES/MY.JPG" />';
// This immediately fails with message: "failed to open stream: Permission denied..."
$getimagesize = getimagesize('//STATIC/IMAGES/MY.JPG');
如果我已经完全控制了STATIC文件夹和子文件夹,以及父HTDOCS文件夹,那么这个棘手问题的原因和解决方案是什么?
更新:在STATIC URL前加上http:,如下所示:
http://STATIC/IMAGES/MY.JPG
...错误更改为
无法打开流:HTTP请求失败! HTTP / 1.1 403禁止
但这是一只红鲱鱼吗?或者这只是问题的另一层,HTTP的前缀是:第一步?
更新2:
将其添加到STATIC域的.htaccess文件中:
AuthBasicAuthoritative On
AllowOverride All
......错误变为:
getimagesize(http://STATIC/IMAGES/MY.JPG):failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error
请注意,这是在使用http:
为域URL添加前缀之后我是否缺少认证步骤?
更新3:
似乎在localhost上,我需要提供一种用于HTML图像显示的URL,另一种用于将图像文件发送到PHP函数。删除:
AuthBasicAuthoritative On
AllowOverride All
...来自.htaccess文件,然后以这种方式修改我的测试代码:
$html_url = "//STATIC/";
$php_url = "c:/xampp/htdocs/STATIC/";
echo '<img style="display: inline;" src="' . $html_url . 'IMAGES/MY.JPG" />';
$getimagesize = getimagesize($php_url . 'IMAGES/MY.JPG');
print_r($getimagesize);
......问题解决了。我不需要为我的本地主机维护两个不同的URL(这不是我的实时服务器上的问题)并相应地编辑我的代码???
答案 0 :(得分:0)
请不要更改文件权限!用户系统已有权从任何文件夹中读取。
您的问题出在路径逻辑中。 当浏览器读取HTML并看到“//STATIC/IMAGES/MY.JPG”之类的路径时,它会将其读作“http://example.com/static/images/my.jpg”,这意味着“your_website_folder / static / images / my.jpg”。
当您的服务器读取提供的路径时,它会看到'some_root_folder / static / images / my.jpg'。根文件夹是系统的根目录。在你的情况下,可能是'C:/ Windows / System32'。你可以在这看到危险,对吧?
所以,作为一个解决方案,建议在php中创建一个存储网站根文件夹的变量:
define("__SITE_ROOT" , $_SERVER['DOCUMENT_ROOT']);
//this will define constant with /your_website_folder in it
然后你只需追加你剩下的路径,就像这样:
$img_path = __SITE_ROOT . $resource; // providing //static/images/my.jpg in a $resource