Назад | Перейти на главную страницу

Разрешить метод POST только для определенного файла в каталоге

У меня есть один файл, который должен быть доступен только через метод POST.

/var/www/folder/index.php

Корень документа /var/www/ и index.php вложен в папку.

Версия Apache: 2.4.4.
Мои конфигурации следующие:

<Directory "/var/www/folder">
    <Files "index.php">
        order deny,allow
        Allow from all
        <LimitExcept POST>
            Deny from all
        </LimitExcept>
    </Files>
</Directory>

Я захожу на свой сервер в 127.0.0.1/folder но я могу ПОЛУЧИТЬ и ОТПРАВИТЬ файл, как обычно.

Я также пробовал изменить порядок, order allow,deny, require, limitexcept и limit.

Как я могу разрешить обработку запросов POST только одним файлом в папке?

Вы можете использовать Require директива:

<Directory "/var/www/folder">
    <Files "index.php">
        Require method POST
    </Files>
</Directory>

Однако, поскольку это часть раздела авторизации, вы можете попробовать следующее:

<Directory "/var/www/folder">
    <Files "index.php">
        <LimitExcept POST>
            Order allow,deny
            Deny from all
        </LimitExcept>
    </Files>
</Directory>

Если ваши уловки с конфигурацией apache не работают, вы можете сделать это в самом index.php. Вверху файла добавьте что-то вроде этого:

<?php
if($_SERVER['REQUEST_METHOD'] != "POST") {
    header("HTTP/1.0 403 Forbidden");
    print("Forbidden");
    exit();
}

В Order, Allow и Deny семейство директив управления доступом устарело в пользу mod_authz_host.

На самом деле это может быть причиной того, что ваша существующая конфигурация не работает, поскольку любые конфликтующие Require директивы будут иметь приоритет над вашей конфигурацией (которая все еще поддерживается с помощью mod_access_compat, но эти директивы будут удалены в будущей версии).

Поскольку вы используете семейство 2.4, вам также следует использовать новые директивы стиля. Я протестировал приведенную ниже конфигурацию на 2.4.4, и она работает должным образом:

<Directory "/var/www/folder">
    Require all granted
    <Files "index.php">
        <LimitExcept POST>
            Require all denied
        </LimitExcept>
    </Files>
</Directory>

Замечание Джека о том, что вы можете использовать Require method Директива также верна и, возможно, более похожа на 2.4.

Условие перезаписи действительно было бы более эффективным, но менее безопасным из-за использования Regex, что иногда может быть сложно.