Laravel route() 返回裸 IP 地址而不是域

Posted

技术标签:

【中文标题】Laravel route() 返回裸 IP 地址而不是域【英文标题】:Laravel route() returning naked IP address instead of domain 【发布时间】:2015-07-17 13:49:58 【问题描述】:

在我的本地计算机上没有发现这个问题,但我注意到我的一些页面返回了我的 Web 服务器的裸 IP 地址而不是域名。示例:

route('homepage') 有时会返回 192.XX8.X.2XX192.XX8.X.2XX/index.phpdomain.com/index.php。我的页面在第一次访问时被缓存,并且页面上的所有 URL 有大约 50% 的可能性会出现奇怪的情况。

对于这种奇怪的行为是否有解释,我将如何解决它?这是一个相当令人担忧的问题,因为 Googlebot 列出了我网站的另外三个重复副本。

注意:我还在为我的路线使用 LaravelLocalization 包:https://github.com/mcamara/laravel-localization

我也在 Laravel Forge (nginx) 下运行这个应用程序

【问题讨论】:

您可以编写 htaccess 规则将 IP 地址重定向到域名。 Google 不应该缓存 301/302 重定向页面。 谢谢,我会尝试将其作为临时解决方案,但我仍然需要修复/调查route() 问题。 .env 变量中的 APP_URL 有什么? 我参加聚会有点晚了,但我遇到了完全相同的问题。在此期间您找到解决方案了吗? @gregory 似乎有一个错误,或者可能是有意 laravel 不在路由生成中使用 APP_URL 。在构建绝对 url 的路由 URL 生成器内部,laravel 使用 symfony getBaseUrl 返回请求的基本 url,而不是你的 APP_URL 中的内容。因此,基本上,如果您缓存 URL,并且某些机器人将通过 IP 地址到达您的服务器,您最终将获得基于 ip 的 URL,唯一的解决方案是以缓存特定于域的方式管理缓存。 :D 这很愚蠢,但我没有看到任何其他解决方案。 【参考方案1】:

我明白,这个问题很老了,但我遇到了同样的问题并找到了解决方案。 (它可以帮助某人)

在此路径上打开文件 RouteServiceProvider:app/Providers/RouteServiceProvider.php

寻找函数mapWebRoutes。现在我们必须从我们的环境中添加调用者domain 配置

protected function mapWebRoutes()

    Route::middleware('web')
        ->namespace($this->namespace)
        ->domain(\Config::get('app.url', null))
        ->group(base_path('routes/web.php'));

在基于路由构建 url 期间 - 系统尝试在当前路由中获取局部变量 domain,如果找到 - 域应立即应用。但是如果属性未定义 - 转到 Symfony 路由模块。

PS:不要忘记在你的 .env 文件中设置APP_URL。 示例:

APP_URL=https://mysimpledomain.ua

【讨论】:

【参考方案2】:

这很可能取决于您的 nginx 配置。如果您只在服务器上配置了您的应用程序,那么它将作为默认设置。当您通过其 IP 地址(或任何其他链接到您的服务器的域)直接访问服务器时,nginx 将为 laravel 应用程序提供服务。

有很多方法可以解决这个问题。我建议为服务器配置默认值。这可能只是一个 html 页面,上面写着“恭喜您已到达服务器”或类似内容。另一种是重新配置您应用的 nginx 文件,以将任何不是正确域的内容重定向到您的应用的域名。

server 
    if ($host != example.com) 
        return 301 https://example.com$request_uri;
    
    listen 80;
    server_name example.com;

更多关于 nginx 如何处理请求在这里:http://nginx.org/en/docs/http/request_processing.html

【讨论】:

Laravel 应该处理这个问题,因为它应该使用 APP_URL 来构建 url,我经常得到错误的 url,因为我使用缓存并且一些机器人通过 IP 到达我的网站,ofc 我可以更改我的服务器配置,但我想知道为什么 Laravel 不处理这个。

以上是关于Laravel route() 返回裸 IP 地址而不是域的主要内容,如果未能解决你的问题,请参考以下文章

Laravel API CORS

Laravel,捕获访客 IP 的最佳方法是啥?

Route::get 在 Laravel 8 API 中返回空白

api route laravel 总是返回错误 400

laravel 4将IP地址保存到模型

Laravel 路由中的 IP 地址显示 404