首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无CMS的CDN

无CMS的CDN
EN

Stack Overflow用户
提问于 2017-01-12 23:21:22
回答 1查看 160关注 0票数 0

我已经为一个旧的档案站点(作为子域)设置了一个CDN,它没有CMS,只有一堆.html、.php和媒体(主要是图像、Flash和css )。

我想我至少有三种选择:

  1. 创建.htaccess规则,将适当的本地URL重新路由到CDN规则。优点:容易。缺点:额外的查找可能会辜负CDN的目的。
  2. 使用regex将每个本地URL更改为<? echo maybe_get_CDN_url("..."); ?>,并编写一个函数来确定是返回本地版本还是返回CDN版本。优点:将CDN url集中在一个文件中,以防我们切换提供程序。缺点:闻起来有过度编辑的嫌疑(同时考虑每个文件中所需的include语句,加上running all .html files as .php)。幸运的是,由于这是一个档案站点,其内容不会被进一步编辑,使用这种方法创建新链接的不便是无关紧要的。
  3. 使用regex酌情将每个本地URL更改为本地URL或CDN URL。优点:使HTML处于简单的状态。缺点: CDN提供程序更改时必须重复。(当然,这可以通过使用CNAME来解决,但是目前使用的免费™SSL和CDN解决方案很便宜,不能允许足够灵活的证书来处理这个问题。反驳:为什么我们不删除这个域上的SSL,因为安全性不是一个问题。重新反驳:如果我们这样做,Chrome将开始将这个子域标记为不安全的,我们将不会从HTTP/2中受益。)

我的问题是..。在这些解决方案中,哪一个是最不明智的?

或者有其他的想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-07 22:30:00

最后,我选择了选项2。在我看来,在完成HTML页面服务之前,它基本上是通过过滤URL来模拟CMS的。

用regex、BeautifulSoup或其他方式替换URL

每个URL被替换如下:

代码语言:javascript
复制
   <img src="https://foo.com/bar.gif" />
-> <img src="<?php echo cdn( "bar.gif" ); ?>" />

这也将起作用:

代码语言:javascript
复制
   <img onclick="myFunction('https://foo.com/bar.gif')" />
-> <img onclick="myFunction('<?php echo cdn( "bar.gif" ); ?>')" />

但是,对于CSS,PHP解析不能在引号内进行。相反,替换整个值:

代码语言:javascript
复制
   background-image: url('https://foo.com/bar.gif');
-> background-image: <?php echo sprintf( "url('%s');", cdn( "bar.gif" ); ?>

CDN函数

cdn的实际代码集中存储在文件根目录中,并假定传递本地URL:

代码语言:javascript
复制
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;
}

当然,这意味着每个文件也必须要求这个文件:

代码语言:javascript
复制
require_once( '/home/username/public_html/cdn.php' );

处理非PHP文件

另一个复杂的问题是,拥有大量HTML和CSS文件的服务器需要知道如何将这些文件作为PHP处理。这个.htaccess规则的作用是:

代码语言:javascript
复制
AddType application/x-httpd-php5 .html .htm .css

然后,每个文件都需要声明头部,但如果包含在其他地方,则不需要声明。这一行是在regex步骤中添加的。然后动态地填充内容类型和字符集;这些只是示例:

代码语言:javascript
复制
<?php if ( ! headers_sent() ) header( "Content-type:text/html; charset=utf-8" ); ?>

综合起来,这些步骤起了作用。*优点:如果CDN位置更改或未来的团队决定取消该服务,则很容易更改cdn.php的常量(或行为)以取消此操作。此外,使这些URL动态的步骤可以很容易地通过regex和删除的.htaccess规则来逆转,如果有人想要撤销这些规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41624816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档