خطای HTTP 405 Method Not Allowed: معنی و راه حل های رفع آن
آیا تا به حال وقتی سعی می کنید درخواست وب سایت یا API ای را بفرستید، با پیام «405 Method Not Allowed» مواجه شده اید و نمی دانید چرا؟ این خطا نشان می دهد سرور روش HTTP مورد استفاده شما را نمی پذیرد، اما دلایل دقیق پشت آن می توانند متنوع و گاهی پیچیده باشند. در این مقاله، به صورت گام به گام و با تکیه بر تجربیات واقعی، ریشه های رایج این مشکل را شناسایی می کنیم. سپس روش های مؤثر برای اصلاح تنظیمات سرور، به روزرسانی مسیرهای روتینگ و رفع تضادهای کدهای وضعیت را به طور دقیق بررسی می کنیم. پس از پایان خواندن، می توانید با اطمینان بیشتری خطای ۴۰۵ را تشخیص داده و راه حل مناسب را اجرا کنید. همچنین نکات پیشگیری از بروز مجدد این خطا را در چارچوب استانداردهای روز وب بررسی می کنیم تا بتوانید سامانه های خود را پایدارتر نگه دارید.
فهرست مطالب
- درک خطای HTTP چهارصد و پنج
- تشخیص درخواست های نامعتبر سرور
- بررسی تنظیمات روش های HTTP
- اصلاح قوانین فایل htaccess
- به کارگیری میدلورهای صحیح برای رفع خطا
- تست نهایی و پیشگیری مستمر
- سوالات متداول
درک خطای 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 غیرفعال می کند.
برای تشخیص دقیق، می توانید:
- در ابزارهای توسعه گر مرورگر (Network tab) متد دقیق درخواست را بررسی کنید.
- به لاگ های سرور (مثلاً
error_logیاaccess_log) نگاه کنید؛ پیام «Method Not Allowed» معمولاً به همراه مسیر و متد نشان داده می شود. - مستندات 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 را برای پوشه موردنظر فعال کنید |
| Nginx | limit_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 تبدیل کند.
برای رفع مشکل، مراحل زیر را گام به گام انجام دهید:
- قبل از هر تغییری، یک کپی پشتیبان از فایل
.htaccessبگیرید. - دستورات
Limit/LimitExceptرا بررسی کنید؛ اگر متد موردنیاز (مثلاً POST) در لیست ممنوع است، آن را حذف یا اصلاح کنید. - قواعد
RewriteEngineرا مرور کنید؛ مطمئن شوید الگویRewriteRuleبه درستی به منظور هدف نهایی (مثلاً انتقال به index.php) تنظیم شده و از پرچم[L]یا[R=307]که ممکن است متد را تغییر دهد، استفاده نشده باشد. - پس از اعمال تغییرات، فایل را ذخیره کنید و با استفاده از ابزارهای مرورگر یا خط فرمان (
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 Core | UseHttpMethodOverride | بعد از UseRouting، قبل از UseEndpoints | 405 برای تمام POST با هدر override |
| Express.js | میدلورهای عمومی (app.use) | قبل از تعریف روت های خاص، اما پس از cors و json | مسیرهای PUT/DELETE نادیده گرفته می شوند |
| Laravel | میدلورهای سفارشی (CheckHttpMethod) | در گروه مناسب api یا web | 405 برای تمام درخواست های 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 را ویرایش کنید. خط زیر را اضافه کنید:
آیا استفاده از CORS می تواند خطای 405 ایجاد کند؟
CORS به خودی خود خطای 405 تولید نمی کند، اما درخواست پیش flight OPTIONS ممکن است توسط سرور رد شود. اگر سرور برای متد OPTIONS تنظیم نشده باشد، مرورگر 405 برمی گرداند. برای حل مشکل، در سرور پشتیبان OPTIONS را برای مسیرهای مورد نیاز فعال کنید.
چک لیست سریع
- درک دقیق علت خطای ۴۰۵ و نقش روش های HTTP.
- شناسایی درخواست های نامعتبر یا مسیرهای نادرست.
- بازبینی پیکربندی سرور برای متدهای مجاز.
- اصلاح قوانین در فایل .htaccess برای هماهنگی با متدها.
- استفاده از میدلورهای مناسب جهت پردازش درخواست ها.
- انجام تست نهایی پس از اعمال تغییرات.
- پیاده سازی مانیتورینگ برای جلوگیری مداوم از خطا.
با تنظیم صحیح روش های HTTP و به کارگیری میدلورهای مناسب، می توانید خطای ۴۰۵ را به سرعت رفع کنید و از بروز مجدد آن پیشگیری کنید. اگر تجربه یا سؤال خاصی در این زمینه دارید، خوشحال می شویم که با ما به اشتراک بگذارید.