【问题标题】:Laravel-4 routes with parameters gets called twice带参数的 Laravel-4 路由被调用两次
【发布时间】:2014-05-02 07:09:53
【问题描述】:

我注意到我正在使用 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 文件是新鲜的,除了上面的四行路由代码外,我没有更改任何内容。我在 public 文件夹中有 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

laravel 提供的 .htaccess 也没有改变:

<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 文件。

非常感谢任何帮助。非常感谢!

【问题讨论】:

  • 路由怎么叫?通过普通链接(http get 请求)还是通过 ajax 请求?如果是 ajax,你可能会遇到 JS 事件冒泡的问题。
  • 通过普通的http获取请求
  • 如果你在 PHP 内置的网络服务器上本地运行它会怎样?只是看看它是 Laravel 问题还是 Apache 相关问题。
  • 在我的laravel环境(laravel 4.1.28)中,上面的路由函数只调用了一次。您的浏览器插件或杀毒软件有什么影响吗?

标签: php laravel-4


【解决方案1】:

没关系,伙计们,我设法找到了奇怪行为为何如此的答案。这与 Laravel 完全无关。似乎是 ISP 级别的互联网过滤设备将重复的 HTTP 请求发送到我的服务器。我猜该设备会发送模仿我们浏览页面请求的重复请求,以检查我们访问的网站是否符合过滤策略...不得不重新设计我的应用程序的一些逻辑以满足此类情况。

【讨论】:

    【解决方案2】:

    我有同样的问题,我解决了。我的问题来自 laravel 中间件。 请检查您的自定义中间件。希望帮助:).. .

    【讨论】:

    • 您能否详细说明您的中间件出了什么问题?
    • 我认为$next($request) 被调用了 2 次。
    【解决方案3】:

    我曾经遇到过同样的问题,经过多次尝试后我意识到我在刀片文件上使用了图像标签,如下所示:

    <img src='#' />
    

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

    这让我工作了几天!

    【讨论】:

      【解决方案4】:

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

      $response = $next($request);
      

      并将此变量用于我需要使用闭包的下一行:$next($request)

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            我遇到了类似的问题。一个调用路由(url)两次的 Laravel 8 应用程序。该问题仅在使用 wget 或 curl 从服务器(在 cloudways)上的 cronjob 调用它时发生。在我本地的开发电脑上,没有问题。如果我再次使用浏览器调用 url,就没有问题了。

            经过几天的努力,我发现罪魁祸首是服务器中的清漆缓存。关闭它解决了这个问题。 Varnish 已经在 APP 级别关闭。我不得不在服务器级别关闭它!

            希望这可能对将来偶然发现此线程的人有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-12-12
              • 2013-09-14
              • 2013-11-24
              • 1970-01-01
              • 1970-01-01
              • 2014-08-10
              • 2017-07-10
              • 2013-10-16
              相关资源
              最近更新 更多