【问题标题】:Too many 404 requests at the same time will result in session lost同时404请求过多会导致会话丢失
【发布时间】:2018-02-09 10:47:00
【问题描述】:

我有一个网站可以加载带有相应标志的国家/地区下拉菜单。我目前没有所有可用的标志,所以我收到了几个 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

【问题讨论】:

  • 您使用的是哪种会话驱动程序?
  • @GiamPy 文件会话驱动
  • 已知有时会导致问题,特别是对于并发请求。尝试使用数据库或 Redis 驱动程序。以前我自己也有过,换了驱动就消失了。
  • @GiamPy Redis 没有运行,所以我将设置一个数据库并用它做一些测试。这听起来像是解决方案。设置完成后会回复你
  • @GiamPy 嗯,似乎设置数据库对我来说失败了。可能是因为这是一天的结束...... .htaccess 技巧有效,所以我现在就使用那个,虽然我会记住这一点一段时间后看看

标签: php apache laravel session http-status-code-404


【解决方案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。重定向不应影响现有文件。

【讨论】:

  • 您可以随时重定向到via.placeholder.com/200x200(将尺寸更改为您需要的尺寸),而不是添加您自己的占位符图片
  • @delboy1978uk 很酷,我不知道。我不会在我自己的网站上重定向到它,因为它使我依赖于另外一项服务(新的故障点)并提供有关谁访问我的网站的服务信息。我会生成所需的占位符图像,下载它并将其保存在我自己的服务器上。
  • 只要我的应用程序环境不是生产环境,我就会使用它。所有开发内容的占位符,生产中的真实图像。
  • 不知何故,服务器对创建数据库并不满意(一切都出错了),但这有效。非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多