我已经为一个旧的档案站点(作为子域)设置了一个CDN,它没有CMS,只有一堆.html、.php和媒体(主要是图像、Flash和css )。
我想我至少有三种选择:
<? echo maybe_get_CDN_url("..."); ?>,并编写一个函数来确定是返回本地版本还是返回CDN版本。优点:将CDN url集中在一个文件中,以防我们切换提供程序。缺点:闻起来有过度编辑的嫌疑(同时考虑每个文件中所需的include语句,加上running all .html files as .php)。幸运的是,由于这是一个档案站点,其内容不会被进一步编辑,使用这种方法创建新链接的不便是无关紧要的。我的问题是..。在这些解决方案中,哪一个是最不明智的?
或者有其他的想法吗?
发布于 2017-02-07 22:30:00
最后,我选择了选项2。在我看来,在完成HTML页面服务之前,它基本上是通过过滤URL来模拟CMS的。
用regex、BeautifulSoup或其他方式替换URL
每个URL被替换如下:
<img src="https://foo.com/bar.gif" />
-> <img src="<?php echo cdn( "bar.gif" ); ?>" />这也将起作用:
<img onclick="myFunction('https://foo.com/bar.gif')" />
-> <img onclick="myFunction('<?php echo cdn( "bar.gif" ); ?>')" />但是,对于CSS,PHP解析不能在引号内进行。相反,替换整个值:
background-image: url('https://foo.com/bar.gif');
-> background-image: <?php echo sprintf( "url('%s');", cdn( "bar.gif" ); ?>CDN函数
cdn的实际代码集中存储在文件根目录中,并假定传递本地URL:
const CDN_LOCAL = 'https://foo.com';
const CDN_OFFSITE = 'https://cdn.foo.com';
const CDN_EXTS = array( 'gif', 'png', 'jpg' ); // (etc.; maybe 20 exts)
function cdn( $url ) {
$url = trim($url);
$parts = explode('.', $url);
$ext = $parts[count($parts) - 1];
$base = ( in_array ( $ext, CDN_EXTS ) ) ? CDN_OFFSITE : CDN_LOCAL;
$url = sprintf( '%s/%s', $new_base, $url );
return $url;
}当然,这意味着每个文件也必须要求这个文件:
require_once( '/home/username/public_html/cdn.php' );处理非PHP文件
另一个复杂的问题是,拥有大量HTML和CSS文件的服务器需要知道如何将这些文件作为PHP处理。这个.htaccess规则的作用是:
AddType application/x-httpd-php5 .html .htm .css然后,每个文件都需要声明头部,但如果包含在其他地方,则不需要声明。这一行是在regex步骤中添加的。然后动态地填充内容类型和字符集;这些只是示例:
<?php if ( ! headers_sent() ) header( "Content-type:text/html; charset=utf-8" ); ?>综合起来,这些步骤起了作用。*优点:如果CDN位置更改或未来的团队决定取消该服务,则很容易更改cdn.php的常量(或行为)以取消此操作。此外,使这些URL动态的步骤可以很容易地通过regex和删除的.htaccess规则来逆转,如果有人想要撤销这些规则。
https://stackoverflow.com/questions/41624816
复制相似问题