405使用mod-rewrite对PHP脚本的PUT请求出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了405使用mod-rewrite对PHP脚本的PUT请求出错相关的知识,希望对你有一定的参考价值。

我使用在CentOS机器上的Apache上运行的php构建了一个API。我正在尝试向v1/object/{objectID}/subobject/{subobjectID}发出PUT请求,但我收到405错误。当我向同一个端点发出GET请求时,它可以工作。当我向v1/object/{objectID}提出PUT请求时,它有效。为简化起见,我用一个简单的echo语句替换了api.php中的所有代码。

api.php的内容:

<?php
echo "got here";
?>

.htaccess的内容:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule v1/(.*)$ v1/api.php?request=$1 [QSA,NC,L]
</IfModule>

以下是我用curl制作的PUT请求:

curl -i -X PUT -d '{"var1":"val1","var2":"val2"}' "http://x.x.x.x/api/v1/object/1/subobject/1?apiKey=somekey&secretToken=secret"

结果如下:

HTTP/1.1 405 Method Not Allowed
Date: Fri, 15 Dec 2017 03:31:21 GMT
Server: Apache/2.2.15 (CentOS)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 359
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>405 Method Not Allowed</title>
</head><body>
<h1>Method Not Allowed</h1>
<p>The requested method PUT is not allowed for the URL /api/v1/object/1/subobject/1.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at x.x.x.x Port 80</address>
</body></html>
答案

在您的服务器上尝试以下更改:

打开文件“/etc/httpd/conf/httpd.conf”并查找以下内容:

<Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
</Limit>

如果已注释掉,请删除#并添加PUT选项

<Limit GET POST OPTIONS PUT>
        Order allow,deny
        Allow from all
</Limit>

然后只需保存,重启服务器并进行测试。

另一答案

事实证明,我正在进行调用,其中API曾经存储在服务器上 - 而不是当前存在的位置。复制和粘贴太多,对细节的关注不够。在发现这个极其尴尬的错误之后,我意识到我没想过要重新检查我的URL的一个原因是我得到了405 Method Not Allowed错误代码,而不是404 Not Found错误代码。

为了学习某些东西而牺牲了我的自信和理智,我在服务器故障上找到了一个新的问题来找到答案:https://serverfault.com/questions/888400/why-does-apache-return-a-405-error-code-on-a-put-request-to-a-file-or-directory

以上是关于405使用mod-rewrite对PHP脚本的PUT请求出错的主要内容,如果未能解决你的问题,请参考以下文章

我的脚本的通用 mod-rewrite htaccess 文件

mod-rewrite递归循环

codeigniter中的mod-rewrite问题

Apache Mod-Rewrite 规则跳过子目录

405 HTTP 错误 - PHP POST

Google Apps 脚本中的 POST 请求和 405 错误