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

Если файл существует, перенаправить на определенный файл, иначе перенаправить на 404 с htaccess

У меня есть такое дерево:

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 кому:

Примеры:

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).
  • прямые запросы каталогов.
  • Запрос не отображается в файл (потому что первое правило не сработало).