Laravel 根路由“/”在子域的前缀路由中不起作用

Posted

技术标签:

【中文标题】Laravel 根路由“/”在子域的前缀路由中不起作用【英文标题】:Laravel root route "/" doesn't work inside prefixed routes on subdomain 【发布时间】:2020-01-07 02:56:57 【问题描述】:

我有以下路线的项目:

Route::namespace('Admin')->prefix('admin')->group(function () 
    Route::group(['middleware' => 'auth:admin'], function () 
    // this is working on my local machine but it's skipped on server which is a subdomain.
        Route::get('/', 'DashboardController@index')->name('admin.dashboard'); 

        // other routes here. all of them working fine
        Route::resource('pages', 'PageController')->except(['show']);
    );
);
Route::get('/', 'HomeController@index'); // this is working fine

在我的本地计算机上,当我打开 app.test/admin 时,一切都按预期工作。如果我没有登录,我可以看到我的登录页面,如果我登录,我可以看到仪表板视图。 在服务器上,这是一个子域,如果我打开 subdomain.app.com/admin 我什么也看不到。服务器响应为 200,没有任何错误。像 admin/pages 这样的所有后续路由都可以正常工作。

apache 中的文档根目录设置为项目的根目录,而不是在公用文件夹中。我在根目录中使用以下 .htaccess 文件。

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %REQUEST_FILENAME -d [OR]
    RewriteCond %REQUEST_FILENAME -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %REQUEST_URI (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1

    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ server.php

</IfModule>

我希望 /admin 路由显示仪表板视图,但我得到一个空白页面。如果没有错误,问题可能出在哪里?

【问题讨论】:

您是否也在本地使用子域进行了测试? 好吧,我没有。我在我的本地开发机器上使用 nginx 代客服务,服务器上是 apache。但我会尝试制作一个子域并在本地进行测试。 我在本地机器上创建了一个子域,一切正常。 /admin 路由正在打开。 你重写server.php而不是index.php有什么原因吗? 是的。 .htaccess 文件位于项目的根目录中,而不是在公用文件夹中。服务器文档根被配置为在项目的根目录 /var/www/html 中,而不是在公共文件夹 /var/www/html/public 中。这就是为什么我使用 htaccess 重写 server.php 【参考方案1】:

这样构建您的路线列表是否有帮助?

    Route::group(
        [
            'domain' => 'account.app.test',
            'prefix' => 'admin', // This is the URL prefix
            'as' => 'admin.', // This gets pre-pended to the route names.
            'middleware' => 'auth:admin',
            'namespace' => 'Admin'
        ],
        function () 
            Route::get('/', 'DashboardController@index')->name('dashboard'); // with 'as' property, this becomes 'admin.dashboard'
            Route::resource('pages', 'PageController')->except(['show']);
        
    );

【讨论】:

不,这并没有改变任何东西。【参考方案2】:

您可以通过在您的 .env 文件中设置您的管理员和用户域,然后像这样使用 Route::domain 来做到这一点:

Route::domain(env('APP_ADMIN_URL'))->group(function() 
    Route::get('/', 'AdminController@index');
);

Route::domain(env('APP_USER_URL'))->group(function() 
    Route::get('/', 'UserController@index');
);

除了确保您的两个域都路由到您的 laravel 公共目录之外,无需触摸您的 htaccess

【讨论】:

【参考方案3】:

我找到了答案;)

问题是我的公用文件夹中有一个名为 admin 的文件夹,它与我尝试访问的路由相同。将该文件夹重命名为随机名称修复了我的 /admin 路由。

【讨论】:

以上是关于Laravel 根路由“/”在子域的前缀路由中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如果路由不在子域中,Laravel 子域路由重定向到 404

我的子域路由覆盖了我在 laravel 7 中的正常网络路由

Laravel 如何从子域 URL 中删除“api”前缀

Laravel 路由组前缀 - 变量不起作用

Laravel 路由在 API 中不起作用,返回 404 页

带有前缀和资源的laravel嵌套路由不起作用