Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 缓存阻止.htaccess重定向_Apache_.htaccess_Redirect_Mod Rewrite_Url Rewriting - Fatal编程技术网

Apache 缓存阻止.htaccess重定向

Apache 缓存阻止.htaccess重定向,apache,.htaccess,redirect,mod-rewrite,url-rewriting,Apache,.htaccess,Redirect,Mod Rewrite,Url Rewriting,我想将我的网页上的所有流量从www重定向到非www。因此,每个到www.example.com的请求都将重定向到example.com 这是在my.htaccess中完成的(取自此) 问题是,我以前在.htaccess文件中没有这个规则。因此,如果用户以前使用www.example.com访问过网站,那么现在缓存似乎阻止了重定向到example.com,而www URL则保留在地址栏中 但是,如果我打开一个私有浏览器窗口或清除网站数据,重定向将按预期工作 我已经在Chrome(88.0.4324

我想将我的网页上的所有流量从www重定向到非www。因此,每个到
www.example.com
的请求都将重定向到
example.com

这是在my.htaccess中完成的(取自此)

问题是,我以前在.htaccess文件中没有这个规则。因此,如果用户以前使用
www.example.com
访问过网站,那么现在缓存似乎阻止了重定向到
example.com
,而www URL则保留在地址栏中

但是,如果我打开一个私有浏览器窗口或清除网站数据,重定向将按预期工作

我已经在Chrome(88.0.4324.192)和Firefox(86.0)中对其进行了测试,两种浏览器都显示出相同的行为。操作系统:macOS 10.15.7

如何从服务器端的角度解决这个问题?因为我不能告诉所有用户清除他们的缓存

复制步骤:

  • 在浏览器中清除缓存历史记录,开始一个干净的会话
  • 打开
    www.example.com
  • 将重写规则www添加到.htaccess文件中的非www
  • 再次打开
    www.example.com
    (浏览器应在上次访问的历史记录中包含此地址)。不会重写到
    example.com


  • 编辑:
    可能会出现这种情况,因为浏览器已经缓存了
    www.example.com
    的内容,因此甚至不请求服务器。但是问题仍然是一样的。

    如果他们的计算机已经缓存了该网站,这将非常困难。事实上,不可能强制刷新,因为我假设您没有将其放入代码中


    现在可以做的是在代码中包含一条规则,强制定期清除缓存。这样,您将来的更新将不会面临相同的问题

    或者您也可以完全禁用缓存,这并不理想,但取决于您和您的设计

    --在HTML中

    上面两个代码之间的区别是
    公共
    私有
    ,这表明任何人(
    公共
    )或仅仅是最终用户(
    私有)都可以缓存到
    最大年龄(时间以秒为单位)

    但这也可以用其他几种语言显式实现。下面是一个PHP示例

    <?php
     Header("Cache-Control: must-revalidate");
    
     $offset = 60 * 60 * 24 * 3;
     $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
     Header($ExpStr);
    ?>
    
    
    

    以下是一些链接,可以帮助您更好地了解其工作原理

    不会对example.com进行重写
    无法复制此内容。你有代理或缓存插件吗?@anubhava我不知道。我不使用Chrome或Firefox作为我的个人浏览器,只是为了测试。因此,他们是一个干净的安装没有任何额外的,没有插件。使用Firefox的同事可能会重复这个问题。我已经添加了我在问题中使用的浏览器版本。我认为
    www.example.com
    在浏览器历史记录中,而
    example.com
    不在浏览器历史记录中,这一点也很重要。很可能是某些客户端使用缓存版本,不会立即跟随您的重定向。不过,这与重写规则无关。相反,缓存中的内容的日期是该重定向规则之前的时间。因此,只有新客户端才能看到该规则或缓存内容已过期或已删除的客户端。那么,您的意思是,无法强制对现有客户端使用此新重定向规则?“在代码中包含一条规则,强制定期清除缓存”-您是如何做到的?您的代码是用什么语言编写的?我不是OP,但在原则上,不管脚本语言如何,您是如何做到这一点的?正如你在第一句中所说,“不可能强制刷新”,所以我很好奇你所说的“定期缓存清除”是什么意思?谢谢你的详细回答,我想我会通过实现html缓存控制来防止这些类型的缓存问题,而不是完全没有缓存,但是有时间限制。@White先生,我想他的意思是,在页面已经缓存之后,我不能强制刷新。但是对于将来的缓存,我可以实现一些东西,定期触发刷新缓存。我想这可以在HTML中用那些
    httpequiv
    meta标记来完成?(答案包括如何完全关闭缓存的示例,但不包括如何配置缓存持续时间)
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    
    <IfModule mod_headers.c>
      Header set Cache-Control "no-cache, no-store, must-revalidate"
      Header set Pragma "no-cache"
      Header set Expires 0
    </IfModule>
    
    Cache-Control : public, max-age=3600;
    
    Cache-Control : private, max-age=3600;
    
    <?php
     Header("Cache-Control: must-revalidate");
    
     $offset = 60 * 60 * 24 * 3;
     $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
     Header($ExpStr);
    ?>