将所有img链接更改为指向PHP中的无Cookie域的理想方式

时间:2010-07-15 18:52:27

标签: php html

我有一个使用MVC的PHP站点,它为大多数请求动态构建HTML。 我正在更新我的网站以在无Cookie域上托管图像/静态内容。 目前,images / css是作为相对URL的链接写出来的。

我现在能想到的最好的方法是更改​​写出<img>标签和css链接的所有html,以使用PHP函数,该函数使用无Cookie域而不是相对URL插入绝对URL。但是,这需要对代码进行大量更改,并且可能会遗漏一些标记/链接。

有关更好的方法处理此问题的任何建议吗?

3 个答案:

答案 0 :(得分:1)

HTML

<base>

关于子页面?如果您没有HTML的任何静态部分,我不知道

答案 1 :(得分:1)

你可能(如果你很懒)做这样的事情:

在请求开始时(第一个文件的顶部):

ob_start('parseImages');

然后声明函数:

function parseImages($data, $status) {
    static $body = '';
    switch ($status) {
        case PHP_OUTPUT_HANDLER_START:
        case PHP_OUTPUT_HANDLER_CONT:
            $body .= $data;
            return '';
            break;
        case PHP_OUTPUT_HANDLER_END:
            $body .= $data;
            $dom = new DomDocument();
            $dom->loadHtml($body);
            $imgs = $dom->getElementsByTagName('img');
            foreach ($imgs as $img) {
                $src = (string) $img->getAttribute('src');
                if (substr($src, 0, 4) != 'http') {
                    //internal link
                    $src = 'http://my.cookieless.com/' . ltrim($src, '/');
                    $img->setAttribute('src', $src);
                }
            }
            return $dom->saveHtml();
     }
}

答案 2 :(得分:0)

sed解决方案:

在所有html文件上使用sed。您可以使用PHP(或脚本函数)遍历所有文件。 glob对此很有用。

<?php
// this sed assumes you have 
// <img src="imgs/example.png" />
// and want to change it to
// <img src="http://www.noCookies.com/imgs/example.png" />

// Loop through each .html file in current directory and create an .html2
// If satisfied w results can finalize .html2 files
// I use .html2 so you don't overwrite your original files

foreach (glob("*.html") as $file)
{        
    // You have to escape double quotes
    $lookFor = 'src=\"imgs';
    $replaceWith = 'src=\"http://www.noCookies.com/imgs';

    // create the sed command:
    // _g is to do a global search
    $shellCommand = "sed s_{$lookFor}_{$replaceWith}_g {$file}";

    // create a NEW file and open it
    $fp = fopen("{$file}2", "w");

    // preform sed and write it to the new file
    fwrite($fp, shell_exec($shellCommand));
    fclose($fp);
}
?>

编辑 - 原始答案如下: 另一个选项,可能与原始的一样慢或慢,是mod重写

如果您运行Apache,并且所有图像都在一个单独的文件夹中(即使它们不是,但它更多的工作),您可以使用mod_rewrite ......这样的东西......?我对mod_rewrite有点生疏,但你想采取相对路径,并用绝对路径切换它:

RewriteEngine on
RewriteRule ^media/images/(.*) http://noCookies.com/media/images/$1 [L]

我认为这绝对是顺便说一下的。然后你可以随着时间的推移慢慢改变旧的img源。或者只保留旧的,并为您添加的任何新图像添加正确的img src。

以下是mod_rewrite documenation,它有点不透明...... tutorials on preventing image hotlinking中的一些也可能会有所帮助

我记得,this is a good mod_rewrite tips and tricks page