Yii2 RestFul API - 生产时出现错误 404,仅执行少量操作
Yii2 RestFull API - Error 404 on production with few actions onlyy
我有问题,
我使用 Yii2 为 API 创建了许多操作。
我最近遇到了一个问题:虽然在本地主机上一切正常,但当我在服务器上上传时,以下操作 return 出现 404 错误。
我一直在尝试许多不同的解决方案(尝试创建另一个控制器)但都没有成功
这些功能的目标是upload/delete张图片。
config/main.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => require 'urls.php',
],
config/urls.php
'POST api/controller/<id>/logo-upload' => 'controller-name/logo-upload',
'POST api/controller/<id>/background-image-upload' => 'controller-name/background-image-upload',
'POST api/controller/<id>/gallery-upload' => 'controller-name/update-gallery',
'POST api/controller/<id>/delete-logo' => 'controller-name/delete-logo-image',
'POST api/controller/<id>/delete-background' => 'controller-name/delete-background-image',
'POST api/controller/<id>/gallery/<galleryID>/delete' => 'controller-name/delete-gallery-image',
这是我创建的示例控制器。我更改了一些变量名称或 class 名称,但没有改变逻辑。
controller-name.php
<?php
namespace frontend\controllers;
use yii\rest\ActiveController;
use yii\filters\Cors;
use yii\helpers\ArrayHelper;
use yii\filters\ContentNegotiator;
use yii\web\Response;
use yii\helpers\BaseJson;
use yii\data\ActiveDataProvider;
use yii\web\UploadedFile;
use Yii;
class Controller extends RestController
{
public $modelClass = 'common\models\Model';
public function actions()
{
$actions = parent::actions();
unset($actions['delete'], $actions['create'], $actions['update'], $actions['index'], $actions['options']);
return $actions;
}
public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'cors' => [
'Origin' => ['*'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS', 'POST'],
],
],
[
'class' => 'yii\filters\ContentNegotiator',
'only' => ['view', 'index', 'update'], // in a controller
// if in a module, use the following IDs for user actions
// 'only' => ['user/view', 'user/index']
'formats' => [
'application/json' => Response::FORMAT_JSON,
],
'languages' => [
'en',
'fr',
],
]
], parent::behaviors());
}
protected function verbs()
{
return [
'index' => ['GET', 'HEAD'],
'view' => ['GET', 'HEAD'],
'create' => ['POST'],
'update' => ['POST', 'PUT', 'PATCH'],
'delete' => ['DELETE'],
];
}
protected function findModel($id)
{
if (($model = Model::findOne($id)) !== null &&
(Yii::$app->user->identity->isAdmin() || $model->owner_id === Yii::$app->user->id)
) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
public function actionLogoUpload($id)
{
$card = $this->findModel($id);
$image = Image::upload($card, 'logoImageFile');
if ($image->errors) {
return $result = ["success"=>false, "message"=> $image->getErrors()];
}
if (!empty($image)) {
$card->image_id = $image->id;
if ($card->validate() && $card->save()) {
$result = [
"success"
];
// }
return $result;
} else {
return $result = ["success"=>false, "message"=> $card->getErrors()];
}
}
}
}
编辑
好的,删除 header 中的 Content-type:multipart/form 日期可以使路由正常工作,但显然代码不起作用,因为没有文件被发送。
问题可能出在您的服务器配置上。您必须配置服务器以重写 index.php
脚本的未知路径。
例如,当我将 yii2 与 apache 一起使用时,我有以下 web/.htaccess
文件:
# use mod_rewrite for pretty URL support
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php
# ...other settings...
Options +FollowSymLinks
当然,很多细节取决于您的主机和服务器配置(例如,是否允许 .htaccess
文件)。 Yii 的文档有更多关于配置不同 Web 服务器的信息 here。
好的,原来请求中有一个额外的 space。代码没问题。
我有问题, 我使用 Yii2 为 API 创建了许多操作。 我最近遇到了一个问题:虽然在本地主机上一切正常,但当我在服务器上上传时,以下操作 return 出现 404 错误。
我一直在尝试许多不同的解决方案(尝试创建另一个控制器)但都没有成功
这些功能的目标是upload/delete张图片。
config/main.php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => require 'urls.php',
],
config/urls.php
'POST api/controller/<id>/logo-upload' => 'controller-name/logo-upload',
'POST api/controller/<id>/background-image-upload' => 'controller-name/background-image-upload',
'POST api/controller/<id>/gallery-upload' => 'controller-name/update-gallery',
'POST api/controller/<id>/delete-logo' => 'controller-name/delete-logo-image',
'POST api/controller/<id>/delete-background' => 'controller-name/delete-background-image',
'POST api/controller/<id>/gallery/<galleryID>/delete' => 'controller-name/delete-gallery-image',
这是我创建的示例控制器。我更改了一些变量名称或 class 名称,但没有改变逻辑。
controller-name.php
<?php
namespace frontend\controllers;
use yii\rest\ActiveController;
use yii\filters\Cors;
use yii\helpers\ArrayHelper;
use yii\filters\ContentNegotiator;
use yii\web\Response;
use yii\helpers\BaseJson;
use yii\data\ActiveDataProvider;
use yii\web\UploadedFile;
use Yii;
class Controller extends RestController
{
public $modelClass = 'common\models\Model';
public function actions()
{
$actions = parent::actions();
unset($actions['delete'], $actions['create'], $actions['update'], $actions['index'], $actions['options']);
return $actions;
}
public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'cors' => [
'Origin' => ['*'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS', 'POST'],
],
],
[
'class' => 'yii\filters\ContentNegotiator',
'only' => ['view', 'index', 'update'], // in a controller
// if in a module, use the following IDs for user actions
// 'only' => ['user/view', 'user/index']
'formats' => [
'application/json' => Response::FORMAT_JSON,
],
'languages' => [
'en',
'fr',
],
]
], parent::behaviors());
}
protected function verbs()
{
return [
'index' => ['GET', 'HEAD'],
'view' => ['GET', 'HEAD'],
'create' => ['POST'],
'update' => ['POST', 'PUT', 'PATCH'],
'delete' => ['DELETE'],
];
}
protected function findModel($id)
{
if (($model = Model::findOne($id)) !== null &&
(Yii::$app->user->identity->isAdmin() || $model->owner_id === Yii::$app->user->id)
) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
public function actionLogoUpload($id)
{
$card = $this->findModel($id);
$image = Image::upload($card, 'logoImageFile');
if ($image->errors) {
return $result = ["success"=>false, "message"=> $image->getErrors()];
}
if (!empty($image)) {
$card->image_id = $image->id;
if ($card->validate() && $card->save()) {
$result = [
"success"
];
// }
return $result;
} else {
return $result = ["success"=>false, "message"=> $card->getErrors()];
}
}
}
}
编辑
好的,删除 header 中的 Content-type:multipart/form 日期可以使路由正常工作,但显然代码不起作用,因为没有文件被发送。
问题可能出在您的服务器配置上。您必须配置服务器以重写 index.php
脚本的未知路径。
例如,当我将 yii2 与 apache 一起使用时,我有以下 web/.htaccess
文件:
# use mod_rewrite for pretty URL support
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php
# ...other settings...
Options +FollowSymLinks
当然,很多细节取决于您的主机和服务器配置(例如,是否允许 .htaccess
文件)。 Yii 的文档有更多关于配置不同 Web 服务器的信息 here。
好的,原来请求中有一个额外的 space。代码没问题。