【问题标题】:RewriteRule causes page to reload twiceRewriteRule 导致页面重新加载两次
【发布时间】:2011-08-22 07:52:09
【问题描述】:

我为我的页面设计了两个不同的 RewriteRules:

# Enable URL Rewriting
RewriteEngine on

# exclude followed stuff
RewriteRule ^(js|img|css|favicon\.ico|image\.php|anprobe|content|libs|flash\.php|securimage)/ - [L,QSA,S=2]

# conditions (REQUEST dont point @ file|dir|link)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# rules
RewriteRule ^(?!index\.php)brillen/(.*(brillen)|360|neu)/(.*)([a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(?!\.))(.*)$     /index.php/brillen/$1?art_id=$4&$5&%{QUERY_STRING}      [NS,QSA,L]
RewriteRule ^(?!index\.php)(.*)$                                                            /index.php/$1                                   [NS,QSA,L]

...我遇到了一个奇怪的问题,就是每个请求都会导致页面内部加载两次,从而导致数据库操作和电子邮件调度也执行两次的问题。

有人对此有想法吗?

提前致谢!

注意1:所有请求的资源都是有效的,根据浏览器的资源跟踪可用。

注意 2: 问题可能源于保留和后处理 PATH_INFO 吗? (/index.php/$1 => /index.php/foo/bar/...)

【问题讨论】:

  • 是什么让你觉得每个页面都加载了两次?
  • 正如我所提到的:数据库操作和电子邮件调度执行了两次...我通过触发一些系统日志来验证我的假设,这些系统日志也出现了两次。
  • 错误的来源是一些 php 代码被调用了两次...真丢脸! :(

标签: apache mod-rewrite url-rewriting


【解决方案1】:

重写引擎无法使单个 HTTP 请求运行两次。它将 Apache 的 HTTP 请求路由到静态文件、代理函数或模块(如 PHP),并在请求中进行更改。但它无法克隆请求并将其提供给 apache 2 次。

当您遇到任何“运行两次”问题时,您可能会遇到empty image url bug。事实上,它并不是真正的错误,而是 HTML 的一个特性(至少在 HTML5 之前)和 url-parsing 的一个特性。

如果你在某处得到一个空的 GET url,HTML 声明浏览器应该用相同的参数重新发送相同的查询(给他当前页面的那个)。这可以使 POST 请求发生 2 次(如果请求的第一页是 POST)。那么这些空的 GET url 在哪里呢?大多数时候你会得到:

<IMG SRC="" ...> (in the HTML)

或:

url() (in the css)

或:

<script type="text/javascript" src=""></script>
<link rel="stylesheet" type="text/css" href=""> (in the HTML headers)

另请阅读@Jon 对 favicon 查询的回答。您应该始终使用 wget 或 telnet 80 查询在没有浏览器行为的情况下测试结果。

更新:this blog 上提供了详细的解释和跟进,并添加了 HTML5,这应该可以消除现代浏览器的这种行为。

【讨论】:

  • 我检查了所有资源并搜索了您提到的模式,但它们都不适用......浏览器的 (js) 控制台中甚至没有输出。
  • 在网络扫描上的萤火虫你没有看到第二个 html 请求吗?如果你尝试使用 lynx 或 telnet,你会得到第二次执行吗?
  • 萤火虫中看不到第二个请求。第二个请求实际上对用户根本不可见,它似乎只是在内部完成(因此它只在我的系统日志中可见)。使用 lynx 调用页面也是如此。
  • 感谢 4 您的帮助 regilero 但我刚刚发现问题出在重写之外。最近的一次巧合使我误以为重载来自重写。感谢您在适用情况下的正确回答!
  • @proximus,你能给我们bug的来源吗,供未来的读者使用,proxy-cache,fcgi?
【解决方案2】:

我遇到了同样的问题(或者我是这么认为的)。这是由我在重写规则中没有考虑到的对 favicon.ico 的请求引起的。

【讨论】:

    【解决方案3】:

    我有同样的问题,因为我做了一些url重写,并且脚本被加载了两次,因为我没有添加这个:

    RewriteRule ^(js|img|css|favicon\.ico)/ - [L,QSA,S=2]
    

    这将阻止脚本被加载两次;它解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多