同时404请求过多会导致session丢失

Too many 404 requests at the same time will result in session lost

我有一个网站可以加载带有相应标志的国家/地区下拉菜单。我目前没有所有可用的标志,所以我收到了几个 404。这符合预期,无需担心。

奇怪的是我丢失了登录会话。当页面加载完毕并且我导航离开(甚至刷新页面)时,我需要再次重新登录。这种情况每次都会发生,不是随机的。

如果我在我的脚本中只请求一张错误的 (404) 图片,一切正常,因为我不会丢失我的会话。

~我正在使用 Laravel,如果重要的话

Ubuntu 16.04 PHP version 7.0.22 Apache 2.0 Laravel 4.2

Laravel 会话配置: 'driver' => 'file', 'lifetime' => 120, 'expire_on_close' => false,

apache2/access.log的一部分:

<IP> - - [31/Aug/2017:14:35:35 +0200] "GET /admin/user/edit/1 HTTP/1.1" 200 15970 "https://<dev_website>/admin" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Geck$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_0.png HTTP/1.1" 404 12585 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_1.png HTTP/1.1" 404 12740 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_4.png HTTP/1.1" 404 12738 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_7.png HTTP/1.1" 404 12583 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_6.png HTTP/1.1" 404 12591 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_14.png HTTP/1.1" 404 12583 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KH$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_12.png HTTP/1.1" 404 12583 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KH$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_11.png HTTP/1.1" 404 12585 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KH$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_21.png HTTP/1.1" 302 1078 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
<IP> - - [31/Aug/2017:14:35:36 +0200] "GET /img/flags/nl_18.png HTTP/1.1" 302 1080 "https://<dev_website>/admin/user/edit/1" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHT$
1

当浏览器在短时间内发出许多请求时,依赖于文件的会话可能难以正常工作,因为每次脚本执行都会锁定会话文件,直到脚本完成或调用 session_write_close()。因此,其他请求无法尽快访问会话。这可能是您遇到问题的原因。

我认为最简单的解决方案是在 .htaccess 中添加一个 RewriteRule,它将对不存在的标志图像的请求重定向到现有的占位符图像。类似于:

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^img/flags/\w+.png$ /img/flags/placeholder.png [L]

当然需要创建/img/flags/placeholder.png。重定向不应影响现有文件。