我正在尝试在我的Apache 2.4服务器(在Ubuntu上)上的VirtualHost上创建RESTful API。我有一个名为dbManager.php
的php文件,我使用RewriteRule看起来像api
目录。它的工作正常,除了PUT和DELETE命令,它们返回403错误。这是我的conf文件的编辑版本:
<VirtualHost *>
ServerAdmin onigame@gmail.com
ServerName servername.com
ServerAlias *.servername.com
DirectoryIndex index.html index.php
DocumentRoot /path/to/local/dir/
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
<Limit PUT DELETE>
Require all granted
</Limit>
</Directory>
# RESTful services provided for the fake "api" directory
RewriteEngine on
RewriteRule ^/api/(.*)$ /dbManager.php/$1 [L]
ServerSignature On
AddDefaultCharset utf-8
</VirtualHost>
好吧,PUT和DELETE仍然没有工作并且返回403.我也担心我真的不想在目录上的任何地方允许PUT和DELETE,而只是通过虚拟api
目录。什么是正确的方法?
答案 0 :(得分:1)
我设法解决了我的问题,但我并不是真的理解为什么它有效:
<VirtualHost *>
ServerAdmin onigame@gmail.com
ServerName servername.com
ServerAlias *.servername.com
DirectoryIndex index.html index.php
DocumentRoot /path/to/local/dir/
<Directory />
Options Indexes FollowSymLinks MultiViews
AllowOverride All
</Directory>
<Directory /path/to/local/dir/>
Require all granted
Satisfy All
</Directory>
# RESTful services provided for the fake "api" directory
RewriteEngine on
RewriteRule ^/api/(.*)$ /dbManager.php/$1 [L]
ServerSignature On
AddDefaultCharset utf-8
</VirtualHost>
最好我能弄明白,获得403表示它的访问被阻止,而不是HTTP请求的类型(这将导致405,而不是403)。访问问题在本地目录中,因此它需要一个特殊的部分。但我真的不明白为什么我放在那里的两条线让事情有效。 Require
指令,这是有道理的。但是Satisfy
指令(我可以从documentation中得知)应该默认为All
。
然而,当我删除任何一行时,它都无法正常工作。