没有 CMS 的 CDN
CDN without CMS
我为没有 CMS 的旧档案站点(作为子域)设置了 CDN,只有一堆 .html、.php 和媒体(主要是图像) 、Flash 和 css 张)。
我想我至少有三个选择:
- 创建 .htaccess 规则以将适当的本地 URL 重新路由到 CDN。优点:简单。缺点:额外的查找可能会破坏 CDN 的目的。
- 使用正则表达式将每个本地 URL 更改为
<? echo maybe_get_CDN_url("..."); ?>
并编写一个函数来确定是 return 本地还是 CDN 版本。优势:将 CDN url 集中在一个文件中,以防我们更换提供商。缺点:有过度编辑的可疑味道(还要考虑每个文件中需要的 include
语句,加上 running all .html files as .php)。幸运的是,由于这是一个存档站点,其内容不会被进一步编辑,因此使用这种方法创建新链接的不便是无关紧要的。
- 使用正则表达式将每个本地 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 规则撤消,如果有人想撤消此操作。
我为没有 CMS 的旧档案站点(作为子域)设置了 CDN,只有一堆 .html、.php 和媒体(主要是图像) 、Flash 和 css 张)。
我想我至少有三个选择:
- 创建 .htaccess 规则以将适当的本地 URL 重新路由到 CDN。优点:简单。缺点:额外的查找可能会破坏 CDN 的目的。
- 使用正则表达式将每个本地 URL 更改为
<? echo maybe_get_CDN_url("..."); ?>
并编写一个函数来确定是 return 本地还是 CDN 版本。优势:将 CDN url 集中在一个文件中,以防我们更换提供商。缺点:有过度编辑的可疑味道(还要考虑每个文件中需要的include
语句,加上 running all .html files as .php)。幸运的是,由于这是一个存档站点,其内容不会被进一步编辑,因此使用这种方法创建新链接的不便是无关紧要的。 - 使用正则表达式将每个本地 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 规则撤消,如果有人想撤消此操作。