2

我有一个小脚本,它应该获取脚本添加到的当前页面的元标题。问题是,它在几个测试页面上都可以正常工作,但在我的 CMS 中却不行。它在那里循环直到死亡,我无法访问服务器上的任何页面,直到我完全重新启动 apache 并关闭脚本。

有人可以看看吗?这真是太棒了,因为我用了几个小时的谷歌,当然,我找到了 X 个线程和页面,但从来没有解决这种特殊的循环效果。

<?php
function curPageURL() {
    $pageURL = 'http';
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
?>
<?php
if (!isset($_GET['ignore']))
{
    $url = curPageURL();
    $data = implode("", file("$url?ignore=this"));
    preg_match ("/<title>([^`]*?)<\/title>/", $data, $match);
    $urltitle = $match[1];
}
?>
<?echo $urltitle;?>
4

2 回答 2

3

$_SERVER["REQUEST_URI"]还可以包括这样的 GET 参数:

mysite.com?param1=1&param2=2

然后你尝试附加一个字符串?ignore=this,这样你就得到了

mysite.com?param1=1&param2=2?ignore=this

它由 PHP 翻译成变量,如

param1 = '1'
param2 = '2?ignore=this'

您必须检查?$url 变量中的符号

于 2013-05-30T15:18:59.963 回答
0

我正在使用这个函数来获取当前页面的 url:

function currentURL() {
    $protocol = stripos($_SERVER['SERVER_PROTOCOL'], 'https') === FALSE ? 'http' : 'https';
    $host     = $_SERVER['SERVER_NAME'];
    $port     = $_SERVER["SERVER_PORT"];
    $query    = $_SERVER['REQUEST_URI'];
    return $protocol.'://'.$host.($port != 80 ? ':'.$port : '').$query;
}

但是你的问题来自这里:

if (!isset($_GET['ignore']))
{
    $url = curPageURL();
    $data = implode("", file("$url?ignore=this"));
    /* ... */
}

这将适用于“测试页面”,但您的 CMS 可能会使用 url 重写,这可能会导致您的$_GET['ignore']变量丢失:例如,如果您已经有其他 GET 变量。
您应该查看您的.htaccess文件,或阅读您的 CMS 文档以了解哪些内容可以更改您的网址。

无论如何,您似乎正在构建一些不稳定的代码,而这只是为了获取页面标题。我很确定您有另一种方法可以通过您的 CMS 轻松获得它。

于 2013-05-30T15:19:26.830 回答