带参数的larvel -4路由被调用两次


Laravel-4 routes with parameters gets called twice

我注意到我使用laravel开发的应用程序的激活路由发生了奇怪的行为,经过几个小时的调试,通过xdebug等,观察到我的路由实际上有时被调用两次。为了重新创建这种情况,我用默认文件创建了一个新的laravel项目,并添加了一个简单的路由作为测试,它做了以下事情:

Route::get('/activate/{code}', function($code)
{
   file_put_contents('/home/fa/testproj/route_called.txt', $code . "'n",   FILE_APPEND);
});

基本上这个简单的路由所做的是接受URI上传递的路由参数并将其记录到一个文件中。奇怪的是,我注意到对于我在URI上键入的代码参数(例如http://myserver/activate/123456789),路由被调用了两次,但是对于重复的代码只调用一次(可能是由于一些会话缓存?)多次尝试后,'route_called.txt'文件的内容如下:

123456789
123456789
123838384242
123838384242
123838384242        <---- notice that it's called only once for repeated parameter
1238383842424657347
1238383842424657347
332211576347
332211576347
332211576347    <---- notice that it's called only once for repeated parameter
1238376540897326
1238376540897326

laravel文件是新的,除了上面的四行路由代码外,我没有更改任何内容。我在公共文件夹中有laravel提供的标准文件:

-rw-rw-r-- 1 fa fa    0 Apr 15 16:06 favicon.ico
-rw-rw-r-- 1 fa fa  356 Apr 15 16:06 .htaccess
-rw-rw-r-- 1 fa fa 1586 Apr 15 16:06 index.php
drwxrwxr-x 2 fa fa 4096 Apr 15 16:06 packages/
-rw-rw-r-- 1 fa fa   24 Apr 15 16:06 robots.txt

.htaccess也不受影响,如laravel:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>
    RewriteEngine On
    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

我的服务器是Ubuntu 12.04LTS,运行Apache 2.2.22,包含laravel所需的所有标准php模块。

有些人说这可能是由于缺少favicon.ico问题,但laravel已经解决了这个问题,已经向我们提供了上述favicon.ico文件。

任何帮助都是非常感激的。很多谢谢!

还好,伙计们,我设法找到了为什么会有这种奇怪行为的答案。这和Laravel一点关系都没有。似乎是ISP级别的互联网过滤设备向我的服务器发送了重复的HTTP请求。我猜设备会发送重复的请求,模仿我们的浏览页面请求,以检查我们访问的网站是否符合过滤政策……为了迎合这种情况,我不得不重新设计我的应用程序的一些逻辑

我有同样的问题,我解决了它。我的问题来自laravel中间件。请检查您的自定义中间件。

我有一次遇到了同样的问题,在多次尝试之后,我意识到我在刀片文件上使用了像这样的图像标记:

<img src='#' />

#符号导致每个包含该图像的文件都试图获得具有当前路由地址的图像。

这让我工作了好几天!

我在自定义中间件的第一行调用它:

$response = $next($request);

,并使用这个变量到下一行,我需要使用闭包:$next($reques t)

我删除了第一行,现在它工作了!

嘿,我在AWS托管的应用程序中遇到了同样的问题,而不是在本地…经过几个小时的尝试,我们发现由于某种原因(可能是部署过程中的某些原因),该路由的一个单元测试触发了两次调用.....如果这是你的情况,试着评论任何单元测试,然后找到为什么会发生这种行为!!!!

我遇到了同样的问题。我在控制器中使用redirect(),但是,请求是通过ajax发送的,在这种情况下重定向是无用的。我删除了它,只在ajax调用的成功回调中保留了重定向代码。

success: function(response) {
    location.replace('/mailbox');
},

我也遇到过类似的问题。一个Laravel 8应用调用了两次路由(url)。只有在使用wget或curl从服务器(在cloudways)上的cronjob调用它时才会出现问题。在我的本地开发pc上,没有任何问题。如果我使用浏览器调用url,同样没有问题。

经过几天的挣扎,我发现罪魁祸首是服务器中的清漆缓存。把它关掉就解决了问题。在APP级别已经关闭了清漆。我不得不把它关在servel级别!

希望这篇文章能对将来偶然发现这篇文章的人有所帮助。