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

时间:2014-05-02 07:09:53

标签: php laravel-4

我注意到我的激活路径发生了奇怪的行为,我正在使用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文件来解决这个问题。

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

6 个答案:

答案 0 :(得分:4)

好的人,我设法找到答案,为什么奇怪的行为是如此。这根本与Laravel无关。似乎ISP级别的互联网过滤设备是将重复的HTTP请求发送到我的服务器。我想设备会发送重复的请求来模仿我们的浏览页面请求,以检查我们访问的网站是否符合过滤策略...必须重新设计我的应用程序的一些逻辑,以满足这样的情况。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

<img src='#' />

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

这让我工作了几天!

答案 3 :(得分:0)

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

$response = $next($request);

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

我删除了第一行,现在可以了!

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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