Я создаю RESTFUL API, и мне нужно, чтобы Apache принимал запросы PUT. Всякий раз, когда я указываю URL-адрес, я получаю 403 Forbidden
ошибка.
curl -X PUT api.example.com/api/foo
Я попытался добавить в свой виртуальный каталог следующее (безрезультатно):
<Limit GET POST PUT DELETE HEAD OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST PUT DELETE HEAD OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
Какие еще настройки конфигурации могут вызывать это?
РЕДАКТИРОВАТЬ
Я переписываю свои URL-адреса, все переписываются в index.php следующим образом:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !\.
RewriteRule ^(.*)$ /api/index.php/$1 [L,QSA]
Добавьте это в файл .htaccess в этой папке
- Для Apache 2.2
<Limit GET POST PUT OPTIONS DELETE PATCH HEAD>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST PUT OPTIONS DELETE PATCH HEAD>
Order deny,allow
Deny from all
</LimitExcept>
- Для Apache 2.4
<Limit GET POST PUT OPTIONS DELETE PATCH HEAD>
Require all granted
</Limit>
<LimitExcept GET POST PUT OPTIONS DELETE PATCH HEAD>
Require all denied
</LimitExcept>
Примечание: вы можете удалить методы, которые вам не нужны
Редактировать:
Добавьте это в свой Apache conf:
Script PUT /api/index.php
Предполагается, что ваш реальный скрипт-обработчик называется index.php
и он расположен на /api
.
По крайней мере, с последней версией Apache (2.4.38) с включенной modsecurity, по умолчанию разрешены только эти методы: GET HEAD POST OPTIONS
Когда выполняется запрос PUT, журнал ошибок Apache2 возвращает это сообщение:
[Wed May 06 11:46:56.680835 2020] [:error] [pid 20162] [client 172.16.x.x:58147] [client 172.16.12.144] ModSecurity: Warning. Match of "within %{tx.allowed_methods}" against "REQUEST_METHOD" required. [file "/usr/share/modsecurity-crs/rules/REQUEST-911-METHOD-ENFORCEMENT.conf"] [line "46"] [id "911100"]
[msg "Method is not allowed by policy"] [data "PUT"] [severity "CRITICAL"] [ver "OWASP_CRS/3.1.0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [tag "OWASP_CRS/POLICY/METHOD_NOT_ALLOWED"] [tag "WASCTC/WASC-15"] [tag "OWASP_TOP_10/A6"] [tag "OWASP_AppSensor/RE1"] [tag "PCI/12.1"] [hostname "192.168.x.x"] [uri "/app/api/widgets/grid"] [unique_id "XrKHkEqec4EieQ@yCDCkkQAAABI"], referer: https://192.168.x.x/app
Лучший способ решить эту проблему - изменить эту политику в modsecurity, поэтому отредактируйте файл "/etc/modsecurity/crs/crs-setup.conf"и раскомментируйте следующие строки, добавив PUT, как разрешено:
SecAction \
"id:900200,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:'tx.allowed_methods=GET HEAD POST OPTIONS PUT DELETE'"