Laravel应用执行JSON导入PostgreSQL时出现405方法不允许错误
405 Method Not Allowed 问题排查(Laravel PostgreSQL数据导入)
我不是这个应用的开发者,刚接触这类技术。服务器迁移后(仅变更IP地址,已更新.env中PostgreSQL密码),执行JSON文件导入PostgreSQL的脚本时,浏览器返回ERROR 405 Method Not Allowed,以下是相关代码和配置:
同步控制器代码(SynchronizeController.php)
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Requests\SettingsRequest; use App\Settings; use Illuminate\Http\Request; use Illuminate\Notifications\Messages\data; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Redirect; use DateTime; class SynchronizeController extends Controller { protected $cgiWrapper = null; protected $csvImporter = null; /** * Show the form for editing the specified resource. * * @param \App\Settings $settings * @return \Illuminate\Http\Response */ public function index() { return view('admin.synchronize.index'); } /** * Update the specified resource in storage. * * @param \Illuminate\Http\SettingsRequest $request * @param \App\Settings $settings * @return \Illuminate\Http\Response */ public function update(Request $request) { if ($request->hasFile('thefile')) { if ($request->thefile->getClientOriginalExtension() == 'json') { $content = file_get_contents($request->file('thefile')); $file_json = json_decode($content,true); $created_at = new DateTime(); $created_at = $created_at->format('Y-m-d H:i:s'); $tableCount = 0; $insertTableNames = ''; $insertColumns = ''; $insertValues = ''; foreach($file_json['data'] as $i => $v) { DB::table($i)->delete(); foreach ($file_json['data'][$i] as $j => $g) { $insertTableNames = 'INSERT INTO '.$i; foreach ($file_json['data'][$i][$j] as $key => $value) { $insertColumns = $insertColumns.$key.','; $insertValues = $insertValues.'\''.$value.'\''.','; } $sqlQuery = $insertTableNames.' ('.$insertColumns.'created_at'.') '.'VALUES '.'('.$insertValues.'\''.$created_at.'\''.')'; DB::insert($sqlQuery); $insertColumns = ''; $insertValues = ''; } $tableCount++; } return Redirect::back()->with('tableCount',$tableCount); } else { return Redirect::back()->withErrors(['Format', 'Błędny format pliku! Tylko rozszerzenie .JSON!']); } } else { return Redirect::back()->withErrors(['Plik', 'Nie wybrano pliku do importu!']); } } }
路由配置(web.php)
Route::prefix('admin')->namespace('Admin')->middleware(['auth', 'role:admin'])->group(function () { Route::get('/', 'DashboardController@index')->name('admin.dashboard'); Route::resource('users', 'UserController'); Route::get('users/delete/{user}', 'UserController@destroy')->name('users.delete'); Route::get('settings', 'SettingsController@edit')->name('settings.edit'); Route::post('settings', 'SettingsController@update')->name('settings.update'); Route::get('synchronize', 'SynchronizeController@index')->name('synchronize.index'); Route::post('synchronize', 'SynchronizeController@update')->name('synchronize.update'); Route::get('images/models', 'ImagesController@models')->name('images.models'); Route::get('images/structures', 'ImagesController@structures')->name('images.structures'); Route::get('images/colors', 'ImagesController@colors')->name('images.colors'); Route::get('images/hinges', 'ImagesController@hinges')->name('images.hinges'); Route::get('images/accesories', 'ImagesController@accesories')->name('images.accesories'); Route::get('images/tresholds', 'ImagesController@tresholds')->name('images.tresholds'); Route::get('images/{doorModelCode}/framevariants', 'ImagesController@framevariants')->name('images.framevariants'); Route::get('images/{doorModelCode}/stainedglass', 'ImagesController@stainedGlass')->name('images.stainedglass'); Route::post('images/upload', 'ImagesController@upload')->name('images.upload'); Route::post('images/delete', 'ImagesController@delete')->name('images.delete'); Route::get('infos/lines', 'InfosController@lines')->name('infos.lines'); Route::get('infos/collections', 'InfosController@collections')->name('infos.collections'); Route::post('infos/lines', 'InfosController@lineStore')->name('infos.lines.store'); Route::post('infos/collections', 'InfosController@collectionStore')->name('infos.collections.store'); });
.htaccess配置
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> :Location /*.php Use php7 :Location
排查方向建议
- 表单提交检查:确认页面表单的
method属性为POST,且action正确指向synchronize.update路由,避免路径拼写或请求方法不匹配。 - 服务器模块验证:
- 确保Apache已启用
mod_rewrite模块,Laravel路由重写依赖该模块。 - 检查服务器是否允许POST请求,部分主机配置可能限制该方法。
- 确保Apache已启用
- 清除路由缓存:执行
php artisan route:clear清除旧路由缓存,确保迁移后的路由配置生效。 - 中间件权限排查:验证
auth和role:admin中间件是否正常工作,确认请求携带了有效的认证信息,避免权限拦截导致错误。 - .htaccess语法修正:末尾的
:Location块不符合Apache规范,修正为标准写法:<Location /*.php> Use php7 </Location> - 日志分析:查看Apache/Nginx错误日志和Laravel
storage/logs下的应用日志,获取405错误的具体触发原因。
内容的提问来源于stack exchange,提问作者Przemo
相关产品推荐
相关产品推荐

