【问题标题】:CDN without CMS没有 CMS 的 CDN
【发布时间】:2017-01-12 23:21:22
【问题描述】:

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

我认为我至少有三个选择:

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

那么,我的问题是……在这些解决方案中,哪一个是最不傻的? :D

或者还有其他人想到吗?

【问题讨论】:

    标签: php html .htaccess content-management-system cdn


    【解决方案1】:

    最后,我选择了选项 2。在我看来,在提供完成的 HTML 页面之前通过“过滤”URL 来模拟 CMS。

    用正则表达式、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' );
    

    处理非 PHP 文件

    一个额外的复杂情况是,具有大量 HTML 和 CSS 文件的服务器需要知道将这些文件作为 PHP 来处理。这个 .htaccess 规则可以解决问题:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多