【问题标题】:laravel invalid route action with subdomainlaravel 子域的路由操作无效
【发布时间】:2020-07-09 03:54:37
【问题描述】:

在路由中添加子域的正确方法是什么?我有一个 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 列

【问题讨论】:

  • 我有点困惑。您提到了“子域”,但从代码看来,您正试图在子路径“medaverter”中部署 Laravel。那么它是子域(例如medaverter.tekknow.net)还是子路径(例如tekknow.net/medaverter)?我认为您还应该描述您的部署目录结构,以帮助其他人分析您的问题
  • 你想去medaverter.tekknow.net/appointments吗?
  • 在我的 HostGator 帐户中,medaverter.tekknow.net 被定义为转到 www.tekknow.net/medaverter。我不知道您是否称其为子域或子路径。
  • 哪个域正在读取您的应用程序公用文件夹?
  • 是的,如果我输入 medaverter.tekknow.net,它会将我带到 tekknow.net/medaverter。我有很多子域。每个都有自己的公用文件夹。

标签: php laravel


【解决方案1】:

当你尝试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;
  }

解决方案 1:

在 nginx 配置中改回rewrite ^ https://tekknow.net/;

(我不熟悉hostGatar cPanel,但我认为您可以将medaverter.tekknow.net/MedAverter redirected 更改为http://www.tekknow.net/`)

并且在你的 laravel 项目中,你需要将prefix MedAverter 保留为appointments

解决方案 2:

保留rewrite 代码。这意味着您不需要更改 cPanel 重定向。

并在 laravel 路由中删除 prefix MedAverter。 HostGatar(Nginx) 将自动使用前缀MedAverter 重定向appointments

【讨论】:

  • 我从路由中删除了组前缀。现在当我做tekknow.net/MedAverter/MedAverter/appointments 时,它会说:404 |未找到。如果我做tekknow.net/MedAverter/appointments,它也会说:404 |未找到。我用谷歌搜索了 nginx,它说它是某种程序。据我所知,我没有使用它,除非它是 HostGator 使用的默认值。
  • @user3217883 我对hostGatar cPanel不熟悉,但我认为您可以在没有MedAverter的情况下将medaverter.tekknow.net/MedAverter重定向到tekknow.net,但是laravel路由保留前缀MedAverter .然后尝试 tekknow.net/MedAverter/appointments,
  • 我能够在 hostgator 中为子域禁用重定向。然后我将路线放回这样的组中: Route::group(['prefix' => 'MedAverter'], function() { Route::get('MedAverter/appointments', 'AppointmentController@index'); });但结果一样!
  • @user3217883 能否请您将重定向更改为http://www.tekknow.net/ 并让我访问该网站?
  • 我也试过这样的路由:Route::group(['prefix' => 'MedAverter'], function() { Route::get('/appointments', 'AppointmentController@index '); });但同样的结果。我只是将子域重定向更改为tekknow.net
【解决方案2】:

清除所有缓存

您遇到的问题可能是由于缓存造成的。所以,通过运行确保这不是问题

php artisan route:clear && php artisan view:clear && php artisan config:clear && php artisan cache:clear && php artisan clear-compiled

基本网址

如果你想更改 Laravel 应用的基本 URL,那已经是 asked

多路径前缀

在这种情况下,您的路径中有多个具有相同前缀的路由。如果是这种情况,您可以使用路由组来简化结构。

Route::prefix('medaverter')->group(function () {
    Route::get('/', function () {
        // Path /medaverter
    });
    Route::get('appointments', function () {
        // Path /medaverter/appointments
    });
});

这将分别转到tekknow.net/medavertertekknow.net/medaverter/appointments。您也可以创建另一个前缀,例如testing,以相同方式配置并转到tekknow.net/testingtekknow.net/testing/whatever

命名空间前缀

当您按路由前缀对路由进行分组时,它们的控制器很可能具有类似的 PHP 命名空间。在 medaverter 示例中,所有 medaverter 路由的控制器都可能位于 Medaverter 命名空间下。

Route::namespace('Medaverter')->group(function () {
    // App\Http\Controllers\Medaverter\AppointmentController
    Route::get('medaverter/appointments', 'AppointmentController@index');
});

【讨论】:

  • 我按照您的指示清除了缓存。结果相同。我按照您的说明在多路径前缀部分实现了代码。结果相同。控制器不包含 medaverter 名称空间,因为本地版本不使用它。
  • 您是否也尝试过使用命名空间前缀?
  • 刚刚试了一下:Route::namespace('MedAverter')->group(function() { Route::get('MedAverter/appointments', 'AppointmentController@index'); } );但结果相同
【解决方案3】:

你可以使用路由组,这是一个示例,试试这个:

Route::group(['prefix' => 'medaverter'], function () {
        Route::get('/appointments', [AppointmentController::class, 'index'])->name('index');
     
});

Route::group(['prefix' => 'medaverter'], function () {
    Route::get('/appointments', 'AppointmentController@index');
 
});

【讨论】:

  • 我在第一个逗号之前添加了一个 ],然后它再次将我带到 tekknow.net/appointments 而不是 tekknow.net/medaverter/appointments
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2018-03-01
  • 2020-01-04
  • 2016-09-18
  • 2016-09-25
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多