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

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

我现在能想到的最好的是改变所有的html 写出&lt; img&gt; </ code>标签和css链接以使用PHP函数,该函数使用无cookie域而不是相对URL插入绝对URL。 但是,这需要对代码进行大量更改,并且有可能错过一些标记/链接。</ p>

有关更好的方法来处理此问题的任何建议吗?</ p>
< / DIV>

展开原文

原文

I have a PHP site using MVC, which builds HTML dynamically for most requests. I'm updating my site to host images/static content on a cookieless domain. Currently the images/css are written out as links to relative URLs.

The best I can think of for now is to change all html that writes out <img> tags and css links to use a PHP function which inserts an absolute URL with the cookieless domain instead of the relative URL. However, this involves a lot of change to code and there is potential to miss a few tags/links.

Any suggestions on a better way to handle this?

dongquan0024
dongquan0024 怎么样才使用sed?
大约 10 年之前 回复
dongshao8566
dongshao8566 不,不使用框架
大约 10 年之前 回复
dtqi87613
dtqi87613 你在使用框架吗?(即:蛋糕,Kohana,CI等)
大约 10 年之前 回复

3个回答



sed解决方案:</ p>

在所有html文件上使用sed。 您可以使用PHP(或脚本函数)遍历所有文件。 glob 对此非常有用。</ p>

 &lt;?php 
//这个sed假设您有
//&lt; img src =“imgs / example.png”/&gt;
//并希望将其更改为
//&lt; img src =“http://www.noCookies.com/imgs/example.png”/&gt;

//循环遍历当前目录中的每个.html文件并创建.html2 \ n //如果满意w结果可以最终确定.html2文件
//我使用.html2所以你不要覆盖原始文件

foreach(glob(“*。html”)为$ file)
{\ n //你必须转义双引号
$ lookFor ='src = \“imgs';
$ replaceWith ='src = \”http://www.noCookies.com/imgs';
nn / /创建sed命令:
// _g是进行全局搜索
$ shellCommand =“sed s _ {$ lookFor} _ {$ replaceWith} _g {$ file}”;

//创建一个新的 文件并打开它
$ fp = fopen(“{$ file} 2”,“w”);

//预先形成sed并将其写入新文件
fwrite($ fp,shell_exec($ shellCommand) ));
fclo se($ fp);
}
?&gt;
</ code> </ pre>


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

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

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

我认为这绝对是现实的方式。 然后你可以随着时间的推移慢慢改变旧的img源。 或者只保留旧的,并为您添加的任何新图像添加正确的img src。 </ p>

以下是 mod_rewrite documenation </ a>,这有点不透明...一些关于防止图像热链接的教程也可能会有所帮助</ p>

我记得,这是一个很好的mod_rewrite提示和技巧页面 </ p>
</ div>

展开原文

原文

The sed solution:

Use sed on all you html files. You can loop through all files with PHP (or a script function). glob is a great function for this.

<?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);
}
?>

Edit - original answer follows: Another option option, which is probably just as slow or slower than the original is mod rewrite

If you run Apache, and all the images are in a separate folders (even if they're not, but then it's more work), you could use mod_rewrite... something like this...? I'm a little rusty oon mod_rewrite, but you want to take the relative path, and switch it with an absolute path:

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

I think it's definitely the way the go though. Then you can change the old img sources slowly over time. Or just keep the old ones and add in the correct img src for any new images you add.

Here is the mod_rewrite documenation, which is a little opaque... Some of the tutorials on preventing image hotlinking could also be helpful

I just remembered, this is a good mod_rewrite tips and tricks page

duanla1996
duanla1996 不错。 YW!
大约 10 年之前 回复
doumen5087
doumen5087 sed很好。 谢谢。
大约 10 年之前 回复
dsxsou8465
dsxsou8465 好吧,使用重写引擎,每个文件需要2个HTTP连接(一个到当前域,一个到无cookie)。 因此,您只需避免将几百个字节发送到另一个域,并将其偏移超过两倍,就可以扼杀任何可能的速度增益......
大约 10 年之前 回复
douju6542
douju6542 cookie少域的主要目的是通过不让浏览器发送cookie以及图像请求来加速用户体验....但是,你确实有一点,因为我相信浏览器仍然会发送 饼干?
大约 10 年之前 回复
dougan1205
dougan1205 那种失败的观点,不是吗? 将图像移动到不同域的重点是减少命中服务器的HTTP请求......而Cookieless的目的是减少http带宽。 所以你杀了两个好处......
大约 10 年之前 回复
dsjq62428
dsjq62428 +1,几乎可以肯定是一个mod_rewrite解决方案,不需要按名称重写每个文件,如RewriteRule ^ imagedir /(.*)http://noCookies.example.com/$1
大约 10 年之前 回复



你可能会(如果你很懒)做这样的事情:</ p>

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

  ob_start('parseImages'); 
</ code> </ pre>

然后 声明函数:</ p>

  function parseImages($ data,$ status){
static $ body ='';
switch($ status){
case PHP_OUTPUT_HANDLER_START:

大小写PHP_OUTPUT_HANDLER_CONT:
$ body。= $ data;
return'';
break;
case PHP_OUTPUT_HANDLER_END:
$ body。= $ data;
$ dom = new DomDocument();
$ dom-&gt; loadHtml($ body);
$ imgs = $ dom-&gt; getElementsByTagName('img');
foreach($ imgs as $ img){
$ src =(string)$ img- &gt; getAttribute('src');
if(substr($ src,0,4)!='http'){
//内部链接
$ src ='http://my.cookieless.com /'。 ltrim($ src,'/');
$ img-&gt; setAttribute('src',$ src);
}
}
返回$ dom-&gt; saveHtml();
}
}
</ code> </ pre>
</ div>

展开原文

原文

You COULD (if you were lazy) do something like this:

At the start of the request (The top of the first file):

ob_start('parseImages');

Then declare the function:

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();
     }
}



HTML </ p>

 &lt; base&gt; 
</ code> </ pre >

在子页面上? 如果您没有HTML的任何静态部分,我不知道</ p>
</ div>

展开原文

原文

HTML

<base>

On subpages? If You don't have any static part of HTML, i dunno

dongnaosuan5407
dongnaosuan5407 <base href =“domain.com”/> - 并保留相对路径。 绝对不会改变(我认为)。
大约 10 年之前 回复
duanlu1959
duanlu1959 我猜这会破坏所有链接..
大约 10 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问