Если файл существует, перенаправить на определенный файл, иначе перенаправить на 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 на:

  • перенаправить на 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
2
задан 16 July 2019 в 17:51
1 ответ

перенаправление на download.php

Я предполагаю, что вы имеете в виду «перезапись», а не внешнее «перенаправление».

Я бы предположил, что ваша система (т.е. конфигурация сервера ) уже настроен (с использованием mod_authz _...) для возврата 403 Forbidden при попытке прямого доступа к .htaccess . Я бы оставил это как есть, если только у вас нет специального требования вернуть вместо этого 404.

перенаправление на 404

И просто для пояснения,вы буквально не «перенаправляете» на 404, вы просто «обслуживаете» 404. Если вы перенаправляете на 404, тогда вы сначала отправляете ответ 3xx обратно клиенту, что нежелательно.

В

1153478] файл /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 ).
  • прямые запросы каталогов.
  • Запрос выполняет не отображается в файл (потому что первое правило не сработало бы).
1
ответ дан 3 December 2019 в 12:29

Теги

Похожие вопросы