如何在Laravel 4中获取域名根URL?

52

我已经准备好尖叫了,这有多难?我尝试了太长时间。 如果我有http://www.example.com/more/pages/page.php 或类似的网址,我希望能获取到 www.example.com。

就这样。这样我就可以随心所欲地使用它。当然,在生产或开发中,这将会改变,因此我希望能够动态确认它。

Request::root()

返回 http://www.example.com/more/pages/page.php

URL::to('/')

返回 http://www.example.com/more/pages/page.php

我该如何获得这个链接?为什么我这么难做到??


8
尝试使用 Request::getHttpHost(),根据你的问题看起来这就是你所需要的。 - Jarek Tkaczyk
确实看起来也能行,好的提示。你在哪里找到的? - lowerends
1
Request::getHost() 也可以使用。 - lowerends
url('') - 这非常简单 - Sanaulla
7个回答

77

更新(2017-07-12):

实际上更好的解决方案是使用Request::getHost()

之前的答案:

我刚刚进行了检查,Request::root();在我的情况下返回http://www.example.com,无论我在哪个路由上。然后你可以按照以下方式去掉http://部分:

if (starts_with(Request::root(), 'http://'))
{
    $domain = substr (Request::root(), 7); // $domain is now 'www.example.com'
}

如果问题仍然存在,您可能需要仔细检查或发布更多代码(routes.php,控制器代码等)。

另一种解决方法是简单地使用$_SERVER['SERVER_NAME']


1
$_SERVER['SERVER_NAME'] 返回服务器主机的名称:“当前脚本所在的服务器主机的名称。如果脚本正在虚拟主机上运行,则将是为该虚拟主机定义的值。”这不总是用户所在的URL,例如如果您在vhosts中有别名。在这种情况下,Request :: root()可以正常工作。 - Pim
4
最好使用正则表达式,因为如果你将来切换到 https://,那么你的代码就会出错。 - Jake Wilson
如果您想解析URL,我建议使用parse_url - Mr_Chimp
1
如果使用任何其他不恰好具有4个字符的协议,此代码将无法正常工作。 - Emil Rosenius
getHost不是静态方法。请使用response() -> getHost()或者$request -> getHost() - Rejaul
显示剩余3条评论

37
在 Laravel 5.1 及更高版本中,你可以使用

request()->getHost();
request()->getHttpHost();

(如果端口不是标准的,第二个会添加端口)


2
你也可以使用request()->getSchemeAndHttpHost()来获取带有http://的URL。 - Majid RigiZadeh

36

您也可以测试以下任何一项:

Request::server ("SERVER_NAME")
Request::server ("HTTP_HOST")

似乎比进行任何治疗都更好

Request::root()

好的。


19

我的提示:

  1. 在 .env 文件中查找是否存在:

    APP_URL=http://yourhost.dev

  2. 替换为(或添加)

    APP_DOMAIN=yourhost.dev

  3. 在 config/app.php 文件中查找:

    'url' => env('APP_URL'),

  4. 替换为:

    'domain' => env('APP_DOMAIN'),

    'url' => 'http://' . env('APP_DOMAIN'),

  5. 使用:

    Config::get('app.domain'); // yourhost.dev

    Config::get('app.url') // http://yourhost.dev

  6. 完成!


2
你可以自由地添加任何环境变量,并以此方式使用,例如:针对 API 域、帐户域、帮助文档域和其他任何域。但是,你不需要在 .env 中添加开发域(如 APP_DEV_DOMAIN)。只需使用另一个环境(develop.env、behat.env、qa.env 等)并使用其他值即可。 - kivagant

10

这是针对Laravel 5.1版本的,我不确定它是否适用于早期版本,但如果有人在Google上搜索并进入此处,那么在中间件handle函数中获取$request参数可能会很方便:

$request->server->get('SERVER_NAME')

在中间件处理方法之外,您可以通过辅助函数 request() 访问它。

request()->server->get('SERVER_NAME')

1

在你想要控制器或web.php文件中直接使用。

Request::getHost();

请仔细检查您的代码,确保getHost()方法没有使用$this对象。如果在无效的位置使用了$this对象,可能会出现问题。参考链接:https://stackoverflow.com/a/14154804/11624647 - Balaji

-19

我认为你可以使用asset('/')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接