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

12

我在本地机器上没有发现这个问题,但发现我的一些页面返回的是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重定向页面。 - chris85
谢谢,我会尝试这个临时解决方案,但我仍然需要修复/调查route()问题。 - Helen Che
在.env变量中,你得到了什么关于APP_URL的内容? - Terry
我来晚了,但我遇到了完全相同的问题。你在这段时间里找到解决方案了吗? - gregory
@gregory 看起来有一个 bug,或者也许是 Laravel 故意不在路由生成中使用 APP_URL。在生成绝对 URL 的路由 URL 生成器内部,Laravel 使用 Symfony 的 getBaseUrl,该函数返回请求的基本 URL 而不是你的 APP_URL 中的内容。因此,如果你缓存了 URL,并且某些机器人通过 IP 地址访问你的服务器,你将得到基于 IP 的 URL,唯一的解决方案是以特定于域的方式管理缓存。:D 这很愚蠢,但我没有看到其他解决方案。 - Vytenis Ščiukas
3个回答

4

我知道,这个问题很久了,但我也遇到了同样的问题并找到了解决方案。(这可能会帮助某些人)

打开此路径下的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

1
我曾经在使用中获得了巨大的成功。
\URL::forceRootUrl(\Config::get('app.url'));

boot()中的RouteServiceProvider.php文件中。

-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 访问我的网站。当然,我可以更改服务器配置,但我想知道为什么 Laravel 不处理这个问题。 - Vytenis Ščiukas

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