Правило перезаписи не работает. 403 Ошибка

Я пытаюсь заблокировать доступ ко всем файлам .php во всех моих каталогах, но мне нужно оставить один файл доступным, чтобы он мог обрабатывать запросы пользователей, но мой RewriteRule не работает. Как заставить его работать?

Вот мой .htaccess:

AddDefaultCharset utf-8

Options -MultiViews
Options +FollowSymLinks
Options All -Indexes

Order deny,allow
Deny from all

<Files ~ "\.(txt|xml|css|jpe?g|png|gif|js|pdf)$">
  Allow from all
</Files>

<Files ~ "start\.php$">
  Allow from all
</Files>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_URI} ^/$ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /start.php [QSA]

Теперь, если я хочу получить доступ, например, к http://localhost/test, он показывает ошибку 403: You don't have permission to access /test on this server.


person John    schedule 30.09.2014    source источник


Ответы (2)


Одним из решений этой проблемы является перемещение всех файлов .php за пределы корня документа и сохранение только start.php внутри. Это эффективно предотвращает доступ к любому .php файлу, кроме того, который вы хотите разрешить.


Другое решение основано на конфигурации, что является более дорогостоящим, поскольку Apache должен проверять правила для каждого запрошенного файла.

Доступ к http://localhost/test запрещен, так как у вас есть

Order deny,allow
Deny from all

и разделы Files здесь не применяются. Подробнее см. в разделе Order Directive, особенно в таблице, в которой

Match               Allow,Deny result   Deny,Allow result
---------------------------------------------------------
Match Deny only     Request denied      Request denied

Если вам нужен Deny from all только для указанных файлов, вы должны переместить его в FilesMatch

<FilesMatch "\.php$">
    Deny from all
</FilesMatch>

<FilesMatch "start\.php$">
    Allow from all
</FilesMatch>

Конечно, вы также можете использовать раздел Files. но обратите внимание на примечание

Однако предпочтение отдается ‹FilesMatch›.

person Olaf Dietsche    schedule 30.09.2014

Это просто идея, я не проверял. Я удалил все deny/allow правила.

AddDefaultCharset utf-8

Options -MultiViews
Options +FollowSymLinks
Options All -Indexes

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f // the request is a file
RewriteCond $1 ^.+\.php$ // the requested file has php extension
RewriteCond $1 !^start\.php // and is not that start.php file (the one you will allow)
RewriteRule ^.*$ - [F,L] // forbid request

Просто удалите // комментариев. Это не действительные комментарии htaccess.

person machineaddict    schedule 30.09.2014