خطای HTTP 405 Method Not Allowed: معنی و راه حل های رفع آن

آیا تا به حال وقتی سعی می کنید درخواست وب سایت یا API ای را بفرستید، با پیام «405 Method Not Allowed» مواجه شده اید و نمی دانید چرا؟ این خطا نشان می دهد سرور روش HTTP مورد استفاده شما را نمی پذیرد، اما دلایل دقیق پشت آن می توانند متنوع و گاهی پیچیده باشند. در این مقاله، به صورت گام به گام و با تکیه بر تجربیات واقعی، ریشه های رایج این مشکل را شناسایی می کنیم. سپس روش های مؤثر برای اصلاح تنظیمات سرور، به روزرسانی مسیرهای روتینگ و رفع تضادهای کدهای وضعیت را به طور دقیق بررسی می کنیم. پس از پایان خواندن، می توانید با اطمینان بیشتری خطای ۴۰۵ را تشخیص داده و راه حل مناسب را اجرا کنید. همچنین نکات پیشگیری از بروز مجدد این خطا را در چارچوب استانداردهای روز وب بررسی می کنیم تا بتوانید سامانه های خود را پایدارتر نگه دارید.

فهرست مطالب

درک خطای HTTP چهارصد و پنج

خطای 405 Method Not Allowed نشان می دهد که سرور درخواست را دریافت کرده ولی متد HTTP‑ی (مانند GET، POST، PUT یا DELETE) که برای آن استفاده شده مجاز نیست. به عبارت دیگر، مسیر (URL) هدف می داند فقط برخی متدها را می پذیرد و درخواست شما از این مجموعه خارج است. این خطا متفاوت از خطای 404 است؛ در 404 منبع وجود ندارد، در حالی که در 405 منبع موجود است اما نمی تواند با متد ارسالی کار کند.

چند وضعیت رایج که منجر به 405 می شود عبارتند از:

  • ارسال فرم با method="POST" به آدرسی که فقط GET را می پذیرد.
  • فراخوانی API با PUT در حالی که سرویس فقط PATCH یا POST را پشتیبانی می کند.
  • پیکربندی نادرست فایل .htaccess یا تنظیمات Nginx که متدهای خاص را مسدود می کند.
  • استفاده از افزونهٔ امنیتی که به طور پیش فرض برخی متدها را برای جلوگیری از حملات CSRF غیرفعال می کند.

برای تشخیص دقیق، می توانید:

  1. در ابزارهای توسعه گر مرورگر (Network tab) متد دقیق درخواست را بررسی کنید.
  2. به لاگ های سرور (مثلاً error_log یا access_log) نگاه کنید؛ پیام «Method Not Allowed» معمولاً به همراه مسیر و متد نشان داده می شود.
  3. مستندات API یا تنظیمات مسیریابی (routing) را با درخواست خود مقایسه کنید.

در ادامه یک جدول کوتاه برای مرور سریع متدهای مجاز و نام گذاری رایج آن ها آورده شده است:

متد HTTPوضعیت معمولاً مجاز
GETخواندن داده، نمایش صفحه
POSTایجاد یا ارسال داده
PUTبه روزرسانی کامل منبع
PATCHبه روزرسانی جزئی منبع
DELETEحذف منبع

برای رفع خطای 405 می توانید این گام ها را دنبال کنید:

  • اگر فرم یا اسکریپت تان متد نادرست استفاده می کند، ویژگی method را به متد پشتیبانی شده تغییر دهید.
  • در سرور (Apache یا Nginx) تنظیمات Allow یا limit_except را بروز کنید تا متد مورد نیاز فعال شود.
  • در فایل .htaccess یا تنظیمات سرور، قواعدی که متدها را مسدود می کنند (مثلاً RewriteCond %{REQUEST_METHOD} !^(GET|POST)$) را اصلاح یا حذف کنید.
  • اگر از یک API استفاده می کنید، مستندات را بازبینی کنید؛ ممکن است نیاز به افزودن هدر Content-Type یا توکن احراز هویت برای فعال سازی متد خاص داشته باشید.

بررسی تنظیمات روش های HTTP

خطای 405 Method Not Allowed وقتی ظاهر می شود که سرور به درستی پیکربندی نشده باشد و روش (method) درخواست HTTP توسط تنظیمات محدود شده باشد. این محدودیت می تواند در سطح وب سرور (مانند Apache یا Nginx) یا در لایهٔ نرم افزار میانی (مانند فریم ورک یا افزونه) اعمال شود. برای رفع این مشکل، ابتدا باید بررسی کنید که سرور شما چه روش هایی را برای مسیرهای مختلف می پذیرد؛ به عنوان مثال GET و POST معمولاً مجازند، در حالی که PUT یا DELETE ممکن است به طور پیش فرض مسدود شوند.

در سرورهای Apache، محدودیت ها اغلب از طریق دستورات یا در فایل .htaccess یا فایل تنظیمات اصلی تعریف می شوند. مثال زیر نشان می دهد که چگونه می توانید فقط GET و POST را برای یک مسیر خاص مجاز کنید:



  AllowOverride All
  
    Require all granted
  

  
    Require all denied
  


در Nginx، روش مشابهی با دستور limit_except داخل بلاک location اعمال می شود. اگر بخواهید فقط GET و POST را برای مسیر /api بپذیرید، می توانید از پیکربندی زیر استفاده کنید:

  • location /api {
  •   limit_except GET POST {
  •     return 405;
  •   }
  • }

برای سریع سازی تشخیص تنظیمات نادرست، جدول زیر مقایسهٔ کلیدی بین دو وب سرور محبوب را ارائه می دهد. ستون «تنظیمات» شامل دستورات اصلی است که می توانند منجر به خطای 405 شوند؛ ستون «نحوهٔ رفع» نکات عملی برای اصلاح آن را بیان می کند.

وب سرورتنظیمات منجر به 405راه حل پیشنهادی
Apache که همهٔ روش ها به جز GET/POST را مسدود می کنددستورات را به روز کنید یا AllowOverride را برای پوشه موردنظر فعال کنید
Nginxlimit_except داخل location که روش های دیگر را رد می کندمحدودهٔ limit_except را به روز کنید یا به جای return 405 از allow/deny استفاده کنید

اصلاح قوانین فایل htaccess

فایل .htaccess در سرورهای Apache یک لایه ٔ تنظیمات محلی است که می تواند دسترسی ها، بازنویسی URL و حتی محدودیت های متد HTTP را کنترل کند. وقتی یکی از قوانین این فایل به درستی تنظیم نشده باشد، مرورگر ممکن است با خطای 405 Method Not Allowed مواجه شود؛ یعنی درخواست با متد (GET, POST, PUT …) ارسال شده، اما سرور این متد را برای مسیر موردنظر اجازه نمی دهد.

در اکثر موارد خطا ناشی از یکی از دستورات زیر است:

  • Limit یا LimitExcept که به صورت صریح متدهای خاصی را مجاز یا ممنوع می کند.
  • RewriteRule که به دلیل عدم تطابق الگو، درخواست را به مسیر نادرستی می فرستد.
  • RedirectMatch یا Redirect که ممکن است به صورت اشتباه متد POST را به GET تبدیل کند.

برای رفع مشکل، مراحل زیر را گام به گام انجام دهید:

  1. قبل از هر تغییری، یک کپی پشتیبان از فایل .htaccess بگیرید.
  2. دستورات Limit/LimitExcept را بررسی کنید؛ اگر متد موردنیاز (مثلاً POST) در لیست ممنوع است، آن را حذف یا اصلاح کنید.
  3. قواعد RewriteEngine را مرور کنید؛ مطمئن شوید الگوی RewriteRule به درستی به منظور هدف نهایی (مثلاً انتقال به index.php) تنظیم شده و از پرچم [L] یا [R=307] که ممکن است متد را تغییر دهد، استفاده نشده باشد.
  4. پس از اعمال تغییرات، فایل را ذخیره کنید و با استفاده از ابزارهای مرورگر یا خط فرمان (curl -X POST …) درخواست موردنظر را دوباره تست کنید.

مثال عملی: اگر خط زیر باعث مسدود شدن درخواست های POST به مسیر /api/submit شده باشد، می توانید آن را به صورت زیر اصلاح کنید:

# قبلا

    Order allow,deny
    Deny from all


# اصلاح شده

    Order allow,deny
    Deny from all

دستورعملکرد اصلیتاثیر بر خطای 405
Limitمشخص کردن متدهای مجازممنوع کردن متد موردنظر → 405
LimitExceptاجازه به همه به جز متدهای ذکر شدهقابل استفاده برای رفع محدودیت های اشتباه
RewriteRuleبازنویسی URLتغییر مسیر نادرست می تواند متد را تغییر دهد

به کارگیری میدلورهای صحیح برای رفع خطا

میدلورها در هر فریم ورکی نقطه ای هستند که درخواست HTTP قبل از رسیدن به کنترلر یا پردازش نهایی عبور می کند. اگر میدلور اشتباه پیکربندی شود-مثلاً به صورت سراسری روش GET را مسدود کند-سرور بلافاصله با خطای 405 Method Not Allowed پاسخ می دهد، حتی اگر مسیر مورد نظر از ابتدا پشتیبانی از POST یا PUT داشته باشد.

برای رفع این مشکل ابتدا باید شناسایی کنید که میدلور کجا قرار دارد و چه شرطی بر روش های HTTP اعمال می کند. در فریم ورک های رایج این کار می تواند به صورت زیر باشد:

  • ASP.NET Core: میدلور UseHttpMethodOverride باید پس از UseRouting اما پیش از UseEndpoints قرار بگیرد؛ در غیر این صورت روش های جایگزین (مانند POST با هدر X-HTTP-Method-Override) نادیده گرفته می شوند.
  • Express.js (Node.js): اگر از میدلور app.use(express.json()) یا app.use(cors()) قبل از تعریف روت ها استفاده کنید، اطمینان حاصل کنید که هیچ app.all('*', …) کلی که فقط GET را می پذیرد، قبل از روت های واقعی قرار نگیرد.
  • Laravel (PHP): میدلور TrimStrings یا ConvertEmptyStringsToNull نیازی به محدودیت روش ندارند، اما میدلورهای سفارشی مانند CheckHttpMethod باید در گروه api یا web به درستی تزریق شوند.

یک راهنمای سریع برای اطمینان از ترتیب صحیح میدلورها می تواند به شکل جدول زیر باشد. این جدول فقط شامل میدلورهای کلیدی است که مستقیماً بر متدهای HTTP اثر می گذارند.

فریم ورکمیدلور هدفمحل قرارگیری پیشنهادینتیجهٔ نادرست
ASP.NET CoreUseHttpMethodOverrideبعد از UseRouting، قبل از UseEndpoints405 برای تمام POST با هدر override
Express.jsمیدلورهای عمومی (app.use)قبل از تعریف روت های خاص، اما پس از cors و jsonمسیرهای PUT/DELETE نادیده گرفته می شوند
Laravelمیدلورهای سفارشی (CheckHttpMethod)در گروه مناسب api یا web405 برای تمام درخواست های API

یک مثال عملی: در یک برنامه Express، اگر یک میدلور عمومی برای لاگ گیری به صورت app.use((req, res, next) => { if (req.method !== 'GET') res.status(405).end(); else next(); }); قرار دهید، تمام درخواست های POST یا DELETE بلافاصله رد می شوند. برای رفع این مشکل می توانید شرط را به صورت زیر اصلاح کنید:

app.use((req, res, next) => {
  const allowed = ['GET', 'POST', 'PUT', 'DELETE'];
  if (!allowed.includes(req.method)) {
    return res.status(405).send('Method Not Allowed');
  }
  next();
});

در نهایت، پس از تنظیم میدلورها، همیشه با ابزارهای تست مانند curl یا Postman یک درخواست POST/PUT به مسیر هدف بفرستید و اطمینان حاصل کنید که پاسخ 200 یا کد موفقیت مناسب دریافت می شود، نه 405. این کار به سرعت نشان می دهد که میدلورهای شما به درستی ترتیب یافته اند و مانع پردازش متدهای معتبر نمی شوند.

تست نهایی و پیشگیری مستمر

پس از اعمال تغییرات برای رفع خطای 405 Method Not Allowed، گام مهمی که نباید نادیده گرفته شود، تست نهایی است. ابزارهایی مثل cURL، Postman یا پنل «Network» مرورگر می توانند درخواست های مختلف (GET, POST, PUT, DELETE) را به همان مسیر ارسال کرده و پاسخ سرور را بررسی کنند. هدف این است که اطمینان حاصل شود تنها متدهای مجاز پذیرفته می شوند و برای بقیه ی متدها کد 405 بازگردانده می شود.

یک چک لیست ساده برای تست نهایی می تواند به شکل زیر باشد:

آیتم بررسینتیجه مورد انتظار
درخواست GET به مسیرهای فقط‑POSTکد 405
درخواست POST به مسیرهای فقط‑GETکد 405
درخواست معتبر (مثلاً POST به مسیر POST)کد 200 یا 201
هدرهای Allow در پاسخ 405فهرست متدهای مجاز

تست یک باره کافی نیست؛ برای جلوگیری از بازگشت خطا در آینده باید پیشگیری مستمر را در فرآیند توسعه بگنجانید. اولین قدم، افزودن تست های خودکار (unit یا integration) به CI/CD pipeline است؛ به طوری که هر بار که کد به مخزن اضافه می شود، تمام مسیرها با متدهای مختلف آزمون شوند. علاوه بر این، ثبت لاگ های دقیق در سرور (به خصوص خطاهای 405) به تیم امکان می دهد به سرعت نقاط ضعف را شناسایی کند. تنظیمات سرور مانند .htaccess یا پیکربندی Nginx را بررسی کنید تا از تطبیق دقیق قوانین limit_except اطمینان حاصل کنید.

مثال عملی: فرض کنید یک فرم ثبت نام فقط باید از متد POST استفاده کند، اما یک توسعه دهنده به طور ناخواسته مسیر را به صورت GET نیز باز می کند. با افزودن یک تست در Postman که درخواست GET به /signup می فرستد و انتظار دریافت 405 را دارد، این مشکل در همان اولین بار شناسایی می شود. سپس می توانید در فایل تنظیمات routes.php یا معادل آن، متدهای مجاز را به صورت صریح مشخص کنید تا از بروز مشابه در آینده جلوگیری شود.

سوالات متداول

چرا درخواست POST من به URL GET می شود؟

سرور فقط GET را برای این مسیر تعریف کرده است. وقتی فرم شما به صورت پیش فرض GET ارسال می شود یا جاوااسکریپت به اشتباه متد را تغییر می دهد، خطای 405 ظاهر می شود. مطمئن شوید که attribute method در فرم روی POST تنظیم شده و سرور endpoint مربوط به POST را پیاده سازی کرده است.

آیا می توانم متد DELETE را روی API استاتیک فعال کنم؟

در سرورهای استاتیک معمولاً فقط GET و HEAD فعال هستند. برای فعال کردن DELETE باید تنظیمات سرور (مثلاً در nginx یا apache) را تغییر دهید و مسیر مربوطه را در کد backend تعریف کنید. اگر فقط می خواهید درخواست ها را رد کنید، می توانید در .htaccess یک رد 405 سفارشی بنویسید.

خطای 405 در مرورگر Chrome چه معنایی دارد؟

در Chrome پیغام 405 نشان می دهد سرور متد HTTP ارسال شده را نمی پذیرد. برای رفع آن به تب Network رفته و متد درخواست را بررسی کنید. سپس در کد سمت سرور یا تنظیمات وب سرور متد مورد نیاز را اضافه کنید.

چگونه می توانم .htaccess را برای اجازه PUT تنظیم کنم؟

برای اجازه دادن به متد PUT در Apache می توانید فایل .htaccess را ویرایش کنید. خط زیر را اضافه کنید: Require all denied . همچنین اطمینان حاصل کنید که ماژول mod_allowmethods فعال باشد.

آیا استفاده از CORS می تواند خطای 405 ایجاد کند؟

CORS به خودی خود خطای 405 تولید نمی کند، اما درخواست پیش flight OPTIONS ممکن است توسط سرور رد شود. اگر سرور برای متد OPTIONS تنظیم نشده باشد، مرورگر 405 برمی گرداند. برای حل مشکل، در سرور پشتیبان OPTIONS را برای مسیرهای مورد نیاز فعال کنید.

چک لیست سریع

  • درک دقیق علت خطای ۴۰۵ و نقش روش های HTTP.
  • شناسایی درخواست های نامعتبر یا مسیرهای نادرست.
  • بازبینی پیکربندی سرور برای متدهای مجاز.
  • اصلاح قوانین در فایل .htaccess برای هماهنگی با متدها.
  • استفاده از میدلورهای مناسب جهت پردازش درخواست ها.
  • انجام تست نهایی پس از اعمال تغییرات.
  • پیاده سازی مانیتورینگ برای جلوگیری مداوم از خطا.

با تنظیم صحیح روش های HTTP و به کارگیری میدلورهای مناسب، می توانید خطای ۴۰۵ را به سرعت رفع کنید و از بروز مجدد آن پیشگیری کنید. اگر تجربه یا سؤال خاصی در این زمینه دارید، خوشحال می شویم که با ما به اشتراک بگذارید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *