没有 CMS 的 CDN

CDN without CMS

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

我想我至少有三个选择:

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

那么,我的问题是...这些解决方案中哪一个是最不愚蠢的? :D

或者还有其他想到的吗?

最后,我选择了选项 2。在我看来,在提供完成的 HTML 页面之前,通过 "filtering" 的 URL 本质上模拟 CMS。

URL 替换为正则表达式,BeautifulSoup,或其他

每个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' );

处理 non-PHP 个文件

一个额外的复杂问题是,拥有一堆 HTML 和 CSS 文件的服务器需要知道如何将它们作为 PHP 处理。这个 .htaccess 规则可以解决问题:

AddType application/x-httpd-php5 .html .htm .css

然后每个文件都需要声明 headers,但如果包含在其他地方则不需要。此行是在正则表达式步骤中添加的。然后动态填充 Content-type 和字符集;这些只是示例:

<?php if ( ! headers_sent() ) header( "Content-type:text/html; charset=utf-8" ); ?>

结合起来,这些步骤起到了作用。 :) 优点:如果 CDN 位置发生变化或未来的团队决定取消该服务,则很容易更改 cdn.php 的常量(或行为)以使其无效。此外,用于使这些 URL 动态化的步骤可以很容易地通过正则表达式和 .htaccess 规则撤消,如果有人想撤消此操作。