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 中的正常网络路由