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.2XX
或 192.XX8.X.2XX/index.php
或 domain.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 地址而不是域的主要内容,如果未能解决你的问题,请参考以下文章