【问题标题】:How can I add expire headers for scripts that are not on my server?如何为不在我的服务器上的脚本添加过期标头?
【发布时间】:2018-10-27 18:22:21
【问题描述】:

我有一个网站,我在所有页面/图像和脚本上添加了过期标头,但我不知道如何将过期标头添加到外部脚本。

例如 Google Analytics - 它已将过期标头设置为 1 天。

Google 不是我的问题,来自外部网站的其他一些脚本才是真正的问题,它们根本没有过期标头。

【问题讨论】:

    标签: http header http-headers


    【解决方案1】:

    您只能在响应发送到您自己的服务器的请求时添加标头字段。如果请求发送到另一台服务器,比如 Google 的服务器,那么响应请求的是 Google 的服务器。

    因此,解决您的问题的唯一方法是将外部资源托管在您自己的服务器上。但这只有在资源是静态的、不会因请求而变化且不依赖于其他事物的情况下才有可能。

    【讨论】:

    • 是的,最好确保脚本的所有者管理该脚本的到期时间,并且通常他们将缓存策略设置为这样。
    【解决方案2】:

    唯一的方法是创建从外部站点下载内容然后添加所需标题的脚本。

    <script type="text/javascript" src="http://external.example.com/foo.js"></script>
    

    <script type="text/javascript" src="external.php?url=http://external.example.com/foo.js"></script>
    

    external.php 类似于

    <?php
    header("Expire-stuff: something");
    echo file_get_contents($_GET['url']);
    

    当然这有安全漏洞,所以我建议使用诸如 external.php?file=foo.js 之类的标识符字符串,然后使用

    $files = array('foo.js' => 'http://external/...');
    if(isset($files[$_GET['file']]))
    {
      echo file_get_contents($files[$_GET['file']]);
    }
    

    file_get_contents() 当然会占用你的一些带宽,所以建议也缓存结果。

    【讨论】:

    • 有趣!这对速度有影响吗?
    • 我认为这不是一个好主意,因为现在浏览器可能能够更频繁地从缓存中获取脚本,但是服务器必须在发送任何输出之前在每种情况下下载脚本。即使考虑到服务器可能更好的带宽,我认为这不会真正加快速度;它只是让 PageSpeed 结果看起来更好而已。
    • 您不能使用它,通过代理这些资源,您正在扼杀 CDN 或 S3 等事物存在的原因。它不会给你带来胜利
    • 我宁愿考虑一些前端网络缓存服务器
    【解决方案3】:

    这是不可能的。

    不推荐(并不总是可能):如果是静态内容,请使用脚本预取它并设置您自己的标题。

    【讨论】:

      【解决方案4】:

      您可以使用 PHP 动态加载外部页面,因此您可以在输出原始数据之前发送标头。这不是一个理想的解决方案,但如果你真的需要,你可能想要使用它。

      <?php
      header('expire-header');
      
      echo file_get_contents('http://www.extern.al/website/url');
      

      【讨论】:

      • 这不适用于所有外部脚本,我已经尝试过一个magento站点,但不能正常工作。
      • 我认为这不是一个好主意,因为现在浏览器可能能够更频繁地从缓存中获取脚本,但是服务器必须在发送任何输出之前在每种情况下下载脚本。即使考虑到服务器可能更好的带宽,我认为这不会真正加快速度;它只是让 PageSpeed 结果看起来更好而已。
      【解决方案5】:

      我制作了该代码的一个版本,可让您为每个脚本指定不同的过期日期:

      <?php
      
      $files = array(
          'ga.js' => 'https://ssl.google-analytics.com/ga.js',
          'bsa.js' => 'https://s3.buysellads.com/ac/bsa.js',
          'pro.js' => 'https://s3.buysellads.com/ac/pro.js'
      );
      
      if(isset($files[$_GET['file']])) {
          if ($files[$_GET['file']] == 'ga.js'){
              header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + ((60 * 60) * 48))); // 2 days for GA
          } else {
              header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + (60 * 60))); // Default set to 1 hour
          }
      
          echo file_get_contents($files[$_GET['file']]);
      }
      
      ?>
      

      更多信息:https://www.catswhocode.com/blog/php-how-to-add-expire-headers-for-external-scripts

      【讨论】:

      • 我认为这不是一个好主意,因为现在浏览器可能能够更频繁地从缓存中获取脚本,但是服务器必须在发送任何输出之前在每种情况下下载脚本。即使考虑到服务器可能更好的带宽,我认为这不会真正加快速度;它只是让 PageSpeed 结果看起来更好而已。
      【解决方案6】:

      不要对这些页面测试失去理智...其中一些建议可能有用,而其中一些建议您无能为力。对自己的文件做任何可以做的事情,不要介意外部文件。

      【讨论】:

        【解决方案7】:

        你不能。

        尝试向托管文件的人发送电子邮件,并尝试让他们对其应用 expires-headers。

        【讨论】:

          【解决方案8】:

          以下内容可能对您有用。

          ExpiresActive On
          
          ExpiresDefault "access plus 1 seconds"
          
          ExpiresByType image/x-icon "access plus 2692000 seconds"
          
          ExpiresByType image/jpeg "access plus 2692000 seconds"
          
          ExpiresByType image/png "access plus 2692000 seconds"
          
          ExpiresByType image/gif "access plus 2692000 seconds"
          
          ExpiresByType application/x-shockwave-flash "access plus 2692000 seconds"
          
          ExpiresByType text/css "access plus 2692000 seconds"
          
          ExpiresByType text/javascript "access plus 2692000 seconds"
          
          ExpiresByType application/x-javascript "access plus 2692000 seconds"
          
          ExpiresByType text/html "access plus 600 seconds"
          
          ExpiresByType application/xhtml+xml "access plus 600 seconds"
          

          【讨论】:

          • 不。你只能为你自己的 js 文件添加这个。你不能为外部 js 文件添加这个。
          【解决方案9】:

          您可以添加一个查询字符串参数来欺骗浏览器,使其认为它正在请求不同的资源。例如,如果您希望浏览器从不缓存 CSS,您可以在 URL 的末尾添加一个问号,后跟一个随机数。这通常有效,但可以通过托管文件的服务器使其无效。试试看。

          【讨论】:

          • 这是为了对文件进行版本控制,以确保浏览器忽略以前版本的存在并下载最新版本。但不适用于此要求。
          猜你喜欢
          • 2018-12-22
          • 2014-05-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-06
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多