Laravel Redirect::route() 在 vhost 上转到错误的 url

Posted

技术标签:

【中文标题】Laravel Redirect::route() 在 vhost 上转到错误的 url【英文标题】:Laravel Redirect::route() going to wrong url on vhost 【发布时间】:2013-10-23 19:15:18 【问题描述】:

我今天正在编写一些代码并发送了Redirect::route()。它没有像往常一样重定向到 base_url/route,而是像这样复制了 base_url:

http://myurl.dev/http://myurl.dev/myroute

我认为我做错了什么,所以我回去尝试找出问题所在。我最终用一个新的虚拟主机开始了一个新项目,并将这一点代码放在 app/routes.php 中:

Route::get(
    'test1',
    [
        'as' => 'test1',
        function () 
            return Redirect::route('test2');
        
    ]
);

Route::get(
    'test2',
    [
        'as' => 'test2',
        function () 
            return 'test2hello';
        
    ]
);

当我在浏览器中打开http://myurl.dev/test1 时,它不仅显示“test2hello”,还抛出了http not found 错误,因为找不到http://myurl.dev/http://myurl.dev/test2。这只发生在Redirect::route() 上,它在Redirect::to() 上按预期工作。它也只发生在虚拟主机上;如果我转到 localhost/myurl/public/test1,Redirect::route() 按预期工作。有什么想法吗?


更新:

有人询问我的虚拟主机设置。我在 Mac OSX 10.8.5 上并且正在使用内置的 Apache。我已取消注释 /etc/apache2/httpd.conf 中的 httpd-vhosts.conf 包含行。我在 /etc/apache2/extra/httpd-vhosts.conf 中添加了一些虚拟主机,这是一个:

<VirtualHost *:80>
    DocumentRoot "/Library/WebServer/Documents/example_blog/public"
    ServerName example_blog.local
</VirtualHost>

以及/etc/hosts中的对应行

127.0.0.1   example_blog.local

并重新启动 Apache。该文件夹名为example_blog.local

【问题讨论】:

您是如何设置虚拟主机的?可以发一下配置吗?我在我的 laravel 安装中测试了你的路线,我没有遇到任何问题。我认为这是关于重写模式的问题,或者您的项目中未正确设置 vhost。 @Darwing 我已经添加了我的虚拟主机设置 我现在不知道指令/标签 Directory 是否真的很重要,但是您在虚拟主机配置中缺少它。在this tutorial 中,您可以看到如何使用 Laravel 正确设置 vhost 配置的说明。 【参考方案1】:

问题似乎与 URL 中有一个下划线有关,它没有通过 FILTER_VALID_URL:

https://github.com/laravel/framework/issues/2511

(我的答案不值得称赞,因为我只是整理一下以帮助其他人寻找解决方案)

【讨论】:

好人,我很遗憾我也遇到了这个问题。在我的例子中,域名中有一个破折号。另外,我正在使用一个 Route 组,它在花括号中定义了可能的子域。我有一个名为 'setup' 的路由定义为 'settings/setup' Redirect:route('setup', array('error' => '1')) 将我带到:sub.name.our-site.com/http:/subdomain。 name.our-site.com/settings/setup?error=1 这实际上是它尝试加载的 URL。连字符不应该在域名中有效吗? 祝福你!我正用头撞墙试图弄清楚这一点。【参考方案2】:

试试这个方法:

Route::get(
    'test1',
    [
        'as' => 'test1',
        function () 
            return Response::make('', 302)->header('Location', route('test2'));
        
    ]
);

Route::get(
    'test2',
    [
        'as' => 'test2',
        function () 
            return 'test2hello';
        
    ]
);

如您所见,我们使用 Response 类,而 Redirect 本身使用它来发送标头位置 :)

【讨论】:

以上是关于Laravel Redirect::route() 在 vhost 上转到错误的 url的主要内容,如果未能解决你的问题,请参考以下文章

Redirect::route 在 Laravel 5 中的 URL 中带有参数

Laravel Redirect::route() 在 vhost 上转到错误的 url

Laravel redirect::route 在页面加载之间显示一条消息

to_route() 重复基本路径

如何在 laravel 4 mcamara 中强制链接翻译

使用 Symfony 的重定向功能时在 URL 中锚定