PHP如何制作一个上传的文件链接是内部ip时内部和公共IP时公开使用这个片段?

时间:2012-03-06 04:38:37

标签: php hyperlink preg-match portal

我正在做一个php门户网站。

我做了一个公告部分,用户可以发布消息并附上文件。

所以在这种情况下,用户上传了一个,在页面上会有一个附件的超链接。如果我悬停在它上面,我可以看到这个“192.168.0.100/Announcement/file.pdf”

所以逻辑上如果我在内部网络中并点击它就不会有问题,因为它可以从该IP获取文件。

下一个情况是我已经转发了服务器ip,以便公众可以从外部访问。现在我是一个从外面访问的用户。

所以,如果我要去公告地点并再次悬停在它上面,它将显示相同的链接“192.168.0.100/Announcement/file.pdf”。我肯定无法打开它,因为ip是内部的。

所以我在想,当我在内部时,我是如何做到的,ip是内部的,当我在外面时,ip链接将是公众的?

我从前同事那里得到了这个片段,但我真的不知道代码的作用。有人可以帮我解释一下吗?我试着在网上搜索这个我想要的东西,但我没有一个合适的关键字。

下面的

是片段:

<?php
//filename constant.php

define('SERVERIP',((preg_match("/^192\.168/i",$_SERVER['REMOTE_ADDR']))?'192.168.0.100':'175.136.xxx.xxx'),true);
?> 

以下是公告和附件页面中代码的一部分:

include('_include/constant.php');
$dir = "C:/Inetpub/wwwroot/Announcement/";
$http = sprintf('http://%s/Announcement/',SERVERIP);

print '<td class="middle '.$CLASS.'" align="left" height="20">'.'<a href="http://'.SERVERIP.'/Announcement/'.$filename.'" target="_blank">'.$filename .'</a></td>';

这里有任何php专业人员可以帮助我理解发生的事情,以便下次我知道我实际上在实施什么吗?

2 个答案:

答案 0 :(得分:2)

您无需实现任何此类操作......您需要更改引用URL的方式,其他所有内容都将落实到位。例如,当您在公司的LAN上时,<a href="/">this</a>将显示http://192.168.0.100/。当您从外部访问此网站时,它将显示您从外部访问的IP地址或域名。

你应该使用......

<a href="/something.pdf">something PDF</a>

而不是:

<a href="http://192.168.0.100/something.pdf>something PDF</a>

这就是你正在做的事情。

答案 1 :(得分:1)

您拥有的是三元操作,其结果将分配给常量SERVERIP。它正在使用正则表达式与$_SERVER['REMOTE_ADDR']进行匹配,如果它以192.168开头,则它会获得192.168值,否则会获得175.136值。由于某种原因,它正在通过true来强制执行不区分大小写的搜索。

您可以在PHP docs内阅读有关定义的更多信息。

三元操作的更简单的例子:

$overlyComplex = true;

$thatDudesCodeSucks = (true === $overlyComplex) ? 'yes' : 'no';

// Shorthand for
if (true === $overlyComplex) {
    $thatDudesCodeSucks = 'yes';
} else {
    $thatDudesCodeSucks = 'no';
}

var_dump($thatDudesCodeSucks); // echos yes