You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查方向建议

  1. 表单提交检查:确认页面表单的method属性为POST,且action正确指向synchronize.update路由,避免路径拼写或请求方法不匹配。
  2. 服务器模块验证:
    • 确保Apache已启用mod_rewrite模块,Laravel路由重写依赖该模块。
    • 检查服务器是否允许POST请求,部分主机配置可能限制该方法。
  3. 清除路由缓存:执行php artisan route:clear清除旧路由缓存,确保迁移后的路由配置生效。
  4. 中间件权限排查:验证auth和role:admin中间件是否正常工作,确认请求携带了有效的认证信息,避免权限拦截导致错误。
  5. .htaccess语法修正:末尾的:Location块不符合Apache规范,修正为标准写法:
    <Location /*.php>
        Use php7 
    </Location>
    
  6. 日志分析:查看Apache/Nginx错误日志和Laravelstorage/logs下的应用日志,获取405错误的具体触发原因。

内容的提问来源于stack exchange,提问作者Przemo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:17:54