У меня есть такое дерево:
libs/
html/
app/
uploads/
files/
images/
male.png
female.png
.htaccess
download.php
.htaccess
index.php
/.htaccess
имеет это содержание:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -Indexes
</IfModule>
RewriteEngine On
RewriteRule ^ index.php [END,L]
</IfModule>
я хочу /uploads/.htaccess
кому:
перенаправить на download.php
.htaccess
или download.php
перенаправить 404
.htaccess
или download.php
Примеры:
www.example.com/uploads - redirect 404
www.example.com/uploads/files - redirect 404
www.example.com/uploads/images- redirect 404
www.example.com/uploads/.htaccess - redirect 404
www.example.com/uploads/download.php - redirect 404
www.example.com/uploads/nonexistentfile - redirect 404
www.example.com/uploads/images/male.php - redirect download.php
www.example.com/uploads/images/female.php - redirect download.php
перенаправить на download.php
Я предполагаю, что вы имеете в виду «переписать», а не внешнее «перенаправление».
Я предполагаю, что ваша система (например, конфигурация сервера) уже настроена (с использованием mod_authz _...) для возврата 403 Forbidden при попытке доступа .htaccess
прямо. Я бы оставил это как есть, если только у вас нет конкретного требования вернуть вместо этого 404.
перенаправить на 404
И, чтобы уточнить, вы буквально не «перенаправляете» на 404, вы просто «обслуживаете» 404. Если вы перенаправляете на 404, вы сначала отправляете ответ 3xx обратно клиенту, что нежелательно.
в /uploads/.htaccess
файл попробуйте следующее:
RewriteEngine On
# Rewrite request to download.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !download\.php$ download.php [L]
# Serve a 404 otherwise...
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^ - [R=404]
Первое правило перезаписывает все запросы, которые еще не download.php
и существуют в виде физических файлов для download.php
. (Запрос на .htaccess
должен вернуть 403, если сервер настроен правильно.)
Второе правило обслуживает 404 для всех других «прямых» запросов. Начальное условие, которое проверяет REDIRECT_STATUS
Переменная окружения гарантирует, что мы проверяем только прямые запросы, а не перезаписанные запросы (посредством более ранней перезаписи). Итак, это включает:
download.php
(но не переписывать запросы на download.php
).