Laravel - Artisan提供了错误的基本网址

时间:2014-09-09 17:28:42

标签: php laravel laravel-4

我的app / config / app.php有

'url' => 'http://dev.domain.com/something/somethingElse'

然后我有一个可以从应用程序和artisan命令调用的函数。但URL::route('myRoute')会返回不同的结果。从应用程序调用时,它返回http://dev.domain.com/something/somethingElse/myRoute,但在artisan命令http://dev.domain.com/myRoute中。

URL::to具有相同的行为。

注意:我没有为可能覆盖全局环境的其他环境定义任何其他app.php文件。

为什么会这样? 谢谢!

2 个答案:

答案 0 :(得分:10)

Laravel生成的URL由许多部分组成:

  • 方案:http://https://
  • 主持人:dev.domain.comlocalhost
  • Base:something/somethingElse(Web服务器上的子目录)
  • 尾巴:myRoute,(Laravel路线参数)

然后连接这些部分以形成URL。

最终,Laravel使用$_SERVER请求变量生成URL。 prepareBaseUrl()中的Symfony\Component\HttpFoundation\Request函数最终用于确定网址的 base 部分。

当您通过网络浏览器发出请求时,请求会转到~/public/index.php,并且必要的$_SERVER变量会填充正确的信息,以便Laravel填充基础网址的一部分。

但是,当您在命令行上使用Artisan发出请求时,请求将转到~/artisan脚本。这意味着$_SERVER变量没有以相同的方式填充,Laravel无法确定URL的 base 部分;相反,它返回一个空字符串''

从我所能发现的情况来看,Laravel团队似乎没有任何兴趣使应用程序能够在子目录中开箱即用,例如: Bugfix: domain routing for subfolder

我最终以@medowlock描述的方式解决了我将从命令行调用的脚本,例如:

Config::get('app.url') . URL::route('route.name', ['parameter'=>'value'], false)

这会连接app/config/app.php中设置的应用程序网址和相对网址路径。

答案 1 :(得分:6)

如果您使用Laravel 4.2,则可以调用URL::forceRootUrl函数来明确定义laravel应用程序的根URL。

URL::forceRootUrl( Config::get('app.url') );

在强制使用根网址后,对URL::to的调用将使用您的应用配置文件中的网址定义。

不幸的是,这在Laravel 4.1或Laravel 4.0中不可用