[英]laravel invalid route action with subdomain
在路由中添加子域的正确方法是什么? 我有一个 laravel/homestead 项目在我的本地计算机上运行,但是当我将它移动到共享主机服务器 HostGator 时,它不再工作。 好吧,主页有效,但指向子页面的链接无效。
例如,以下路线在我的本地版本上运行良好:
Route::get('/appointments', 'AppointmentController@index');
但是如果我在远程服务器上使用该路由,它会将它带到 tekknow.net/appointments 而不是 tekknow.net/medaverter/appointments。
所以我按照这里的说明操作: https : //laravel.com/docs/5.6/routing#route-group-sub-domain-routing并添加了这样的前缀:
Route::prefix('MedAverter')->group(function() {
Route::get('/appointments', 'AppointmentController@index');
});
但这也行不通。 它也转到 /tekknow.net/appointments
我也尝试将路线更改为:
Route::get('/MedAverter/appointments', 'AppointmentController@index');
但这也去了 tekknow.net/appointments
有谁知道我做错了什么?
编辑:我进入了我的 HostGator cPanel 并查看了我所有的子域,发现我的子域根是 medaverter.tekknow.net,它链接到 medaverter.tekknow.net/MedAverter 的文档根,它被重定向到http://www。 tekknow.net/MedAverter 。 所以我将我的文件夹从 medaverter 重命名为 MedAverter 以匹配子域重定向。
这是一个屏幕截图,显示了我在 cPanel 中看到的列 Subdomains.Root Domain、Document Root 和 Redirection
当你尝试php artisan route:list | grep appointments
php artisan route:list | grep appointments
,
它打印:
[~/www/MedAverter]# php artisan route:list | grep appointments
| | GET|HEAD | MedAverter/appointments | | App\Http\Controllers\AppointmentController@index | web |
这意味着您的路线MedAverter/appointments
适用于 laravel。
Error 404
表示找不到路由。
所以我认为你的 nginx 配置有问题。
当我尝试http://tekknow.net/MedAverter/MedAverter/appointments 时。 它确实找到了错误500的路线。
所以,我认为你已经在你的 nginx 配置中定义了这段代码:
location = / {
rewrite ^ https://tekknow.net/MedAverter;
}
改回rewrite ^ https://tekknow.net/;
在nginx配置中。
(我不熟悉hostGatar cPanel,但我认为您可以更改medaverter.tekknow.net/MedAverter
重定向到http: medaverter.tekknow.net/MedAverter
/ `)
在你的 Laravel 项目中,你需要保留prefix MedAverter
到appointments
。
保留rewrite
代码。 这意味着您不需要更改 cPanel 重定向。
并删除 Laravel 路由中的prefix MedAverter
。 HostGatar(Nginx) 将使用此前缀MedAverter
自动重定向appointments
。
您遇到的问题可能是由于缓存。 所以,通过运行确保这不是问题
php artisan route:clear && php artisan view:clear && php artisan config:clear && php artisan cache:clear && php artisan clear-compiled
如果您想更改 Laravel 应用程序的基本 URL,这已经是一个问题了。
在这种情况下,您的路径中有多个具有相同前缀的路由。 如果是这种情况,您可以使用路由组来简化结构。
Route::prefix('medaverter')->group(function () {
Route::get('/', function () {
// Path /medaverter
});
Route::get('appointments', function () {
// Path /medaverter/appointments
});
});
这将分别转到tekknow.net/medaverter
和tekknow.net/medaverter/appointments
。 您还可以创建另一个前缀,例如testing
,以相同的方式配置并转到tekknow.net/testing
或tekknow.net/testing/whatever
。
当您按路由前缀对路由进行分组时,它们的控制器可能具有类似的 PHP 命名空间。 在 medaverter 示例中,所有 medaverter 路由的控制器都可能位于 Medaverter 命名空间下。
Route::namespace('Medaverter')->group(function () {
// App\Http\Controllers\Medaverter\AppointmentController
Route::get('medaverter/appointments', 'AppointmentController@index');
});
您可以为此使用路由组,这是一个示例,试试这个:
Route::group(['prefix' => 'medaverter'], function () {
Route::get('/appointments', [AppointmentController::class, 'index'])->name('index');
});
或者
Route::group(['prefix' => 'medaverter'], function () {
Route::get('/appointments', 'AppointmentController@index');
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.