laravel无效的路由操作与子域名

11 浏览
0 Comments

laravel无效的路由操作与子域名

如何在路由中添加子域名?我在本地计算机上有一个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列的内容:

enter image description here

0
0 Comments

问题出现的原因是在Laravel中使用子域名(subdomain)时,路由动作(action)无效。解决这个问题的方法是使用路由组(route groups)来处理,以下是一个示例:

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

或者可以使用以下方式:

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

在第一个示例中,将路由动作指定为`AppointmentController`的`index`方法,并将路由前缀(prefix)设置为`medaverter`。在第二个示例中,只指定了路由前缀,没有指定具体的路由动作。

问题的解决方法是将路由前缀设置为`medaverter`,然后根据需要指定具体的路由动作。这样,访问`tekknow.net/medaverter/appointments`时,就会正确地执行`AppointmentController`中的相应方法。

0
0 Comments

当您尝试php artisan route:list | grep appointments时,

它会打印:

[~/www/MedAverter]# php artisan route:list | grep appointments 
| | GET|HEAD | MedAverter/appointments | | App\Http\Controllers\AppointmentController | web | 

这意味着您的路由MedAverter/appointments在laravel中是有效的。

Error 404表示找不到路由。

所以我认为您的nginx配置有问题。

当我尝试http://tekknow.net/MedAverter/MedAverter/appointments时,

它实际上找到了该路由,但返回500错误。

medaverter-500

所以,我认为您在nginx配置中定义了以下代码:

  location = / {
    rewrite ^ https://tekknow.net/MedAverter;
  }

解决方案1:

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

(我不熟悉hostGatar cPanel,但我认为您可以将medaverter.tekknow.net/MedAverter重定向到http://www.tekknow.net/

并且在laravel项目中,您需要将prefix MedAverter保持为appointments

解决方案2:

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

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

我从路由中删除了组前缀。现在当我访问tekknow.net/MedAverter/MedAverter/appointments时,它显示:404 | Not Found。如果我访问tekknow.net/MedAverter/appointments,也显示:404 | Not Found。我在互联网上搜索了nginx,它是一种程序。据我所知,除非HostGator使用它作为默认设置,否则我不使用它。

我不熟悉hostGatar cPanel,但我认为您可以将medaverter.tekknow.net/MedAverter重定向到tekknow.net而不使用MedAverter,但laravel路由仍然保留前缀MedAverter。然后尝试tekknow.net/MedAverter/appointments,

我能够在hostgator中禁用子域名的重定向。然后我将路由放回到一个组中,像这样:Route::group(['prefix' => 'MedAverter'], function() { Route::get('MedAverter/appointments', 'AppointmentController'); }); 但结果相同!

请你更改重定向为http://www.tekknow.net/,然后让我访问网站?

我还尝试了这样的路由:Route::group(['prefix' => 'MedAverter'], function() { Route::get('/appointments', 'AppointmentController'); }); 但结果相同。我只是将子域名重定向更改为tekknow.net

我认为在您更改cPanel之后,它仍然无法正常工作,仍然会重定向到tekknow.net/MedAverter,可能您需要重新启动或执行某些操作以使更改生效。

我将联系HostGator看看我需要做什么。可能只需要一些时间才能在世界上的所有服务器上生效。

0
0 Comments

问题原因:可能是由于缓存问题导致的。可以通过清除缓存来解决。

解决方法:

1. 清除缓存:运行以下命令来清除缓存:

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

2. 更改基本URL:如果想要更改Laravel应用的基本URL,可以参考已经提出的问题。

3. 多个路径前缀:如果存在多个具有相同前缀的路由,可以使用路由组来简化结构。示例代码如下:

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

这将分别对应`tekknow.net/medaverter`和`tekknow.net/medaverter/appointments`。也可以创建另一个前缀,比如`testing`,以相同的方式配置,然后访问`tekknow.net/testing`或`tekknow.net/testing/whatever`。

4. 命名空间前缀:当按照路由前缀分组路由时,它们的控制器可能具有相似的PHP命名空间。在medaverter示例中,所有medaverter路由的控制器可能位于Medaverter命名空间下。示例代码如下:

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

以上是解决"laravel invalid route action with subdomain"问题的原因和解决方法。

0