服务器加载网站每个页面加载 - session 完整性丢失

Server loads website each page load - session integrity is lost

到 re-evaluate 标题,如果我在浏览器中转到 localhost/,页面会按您预期的方式加载,加载我尝试提供的任何内容都是按我的意愿完成的,不过我在使用 XDEBUG 调试时发现了一些奇怪的东西(这只是 PHP 的调试软件,用于观察调用了哪些函数以及加载的文件) - 有两个日志单次加载。

他们会加载整个应用程序两次,就好像加载了浏览器请求的页面然后服务器决定第二次加载它一样,为了好玩!

这是我在加载页面时所说的两个日志文件,使用 Webgrind 进行分析。

.favicon 是 Google Chrome 试图在每次加载时检索网站图标,据我所知,这将是第三次加载网站,尽管我使用了非法 URL 管理器在看到 /favicon.ico 的 URI 时从 运行 停止应用程序,因此应用程序现在只运行两次。

这是我目前用来操纵 URL 的 .htaccess

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond  !^(index\.php|robots\.txt)

DirectoryIndex index.php
RewriteRule ^(.*)$ index.php?/ [L]

我的 access.log 来自 apache:

::1 - - [09/Jan/2017:23:57:27 -0800] "GET / HTTP/1.1" 200 1597 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"
::1 - - [09/Jan/2017:23:57:28 -0800] "GET / HTTP/1.1" 200 1597 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.51 Safari/537.36"

谢谢!

在我完成整个应用程序的调试后(将 SESSION 记录器放置在 index.php 页面,然后稍后修改 SESSION 值并查看正在请求的内容)在我的 index.php 页面上使用以下代码:

if (!isset($_SESSION['logs']) $_SESSION['logs'] = [];

array_push($_SESSION['logs'], [
  'ip' => $_SERVER['REMOTE_ADDR'],
  'ua' => $_SERVER['HTTP_USER_AGENT'],
  'uri' => $_SERVER['REQUEST_URI'],
  'tim' => time()
]);

(稍后使用print/echo "<pre>", print_r($_SESSION['logs']) ,"</pre>";查看)

我可以看到除了奇数之外所有日志都是一样的

'uri' => '/favicon.ico'

表示 Google Chrome 正在从我的应用请求 favicon.ico,所以我设置了一个临时的

if ($_SERVER['REQUEST_URI'] === '/favicon.ico') exit;

只是为了阻止该请求,并尝试将记录器降低到一个应用程序负载。

将请求限制为 2 个(均为 localhost/)后,我查看了我的 access.log 文件,其中显示了两个相同的请求,但一个请求是 localhost/ 另一个是 -- = undefined 到日志记录),所以经过 24 小时的调试我记得有我以前看过的 Chrome 开发工具其中显示所有网络连接;

Chrome Dev Tools 显示了对 localhost 的两次调用,我认为这很奇怪,但发起者是 jQuery(当时我不知道 $.get AJAX 请求算作 jQuery 发起者,所以我忽略了它,直到最近我才意识到我在加载页面时有一个加载方法,它将请求当前 window.location.hash在 GET

$.get( window.location.hash.substring(3), function(body) {} );

正在请求(加载 localhost/ 时)...localhost/,因为页面没有 hash 部分。

所以这一切都归结为有一个自动加载器,尽管我检查了整个应用程序中的每个 img 标记和 link rel / script 标记(200k 行代码)。

希望对大家有所帮助!他花了很多时间才弄明白这一点。 (抱歉现在是凌晨 2 点英语不好)