# Nex1on — правила для случая, когда корень сайта перевести нельзя.
#
# Как надо: корнем сайта назначается папка public, а весь код движка лежит
# уровнем выше и из браузера недоступен вовсе. Так безопаснее всего, и
# установщик подскажет, как это сделать.
#
# Как бывает: на части хостингов корень сайта поменять нельзя, и архив
# распаковывают прямо в public_html. Тогда работает этот файл: он уводит
# все запросы в public и закрывает всё остальное.
#
# Если корень сайта переведён на public, этот файл просто не читается —
# он остаётся уровнем выше и никому не мешает.

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Ничего, кроме папки public, наружу не отдаём.
    # Проверка идёт по адресу, а не по файлу: до файла дело не дойдёт.
    # Хвост (/|$) обязателен: без него запрос без косой черты уходит
    # к mod_dir, тот добавляет её сам, и вместо страницы движка
    # человек получает 403 от этого же правила.
    # «public» в списке намеренно: без него адрес /public отдавал ту же
    # главную страницу, что и корень. Поисковику это два разных адреса с
    # одинаковым содержимым, а человеку — повод гадать, какой настоящий.
    RewriteRule ^(core|config|storage|database|modules|routes|locales|samples|themes|dev|vendor|public)(/|$) - [F,L]
    RewriteRule ^(bootstrap\.php|nex1on|composer\.(json|lock)|\.env.*|.*\.md)$ - [F,L]

    # Существующий файл внутри public отдаём как есть: стили, картинки, загрузки.
    RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
    RewriteRule ^(.*)$ public/$1 [L]

    # Всё остальное — в единую точку входа.
    RewriteRule ^ public/index.php [L]
</IfModule>

# Без mod_rewrite этот способ размещения не работает. Говорим прямо,
# а не белым экраном.
<IfModule !mod_rewrite.c>
    ErrorDocument 404 "Nex1on: на сервере не включён mod_rewrite. Переведите корень сайта на папку public или включите mod_rewrite."
</IfModule>

# Второй рубеж на случай, если mod_rewrite всё-таки нет: закрываем
# настройки и код обычным запретом доступа.
<FilesMatch "\.(php|md|json|lock|log|sql|ini|yml|yaml)$">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Deny from all
    </IfModule>
</FilesMatch>

# ...кроме единственной точки входа, до которой мы уводим запросы.
<Files "index.php">
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
    <IfModule !mod_authz_core.c>
        Order allow,deny
        Allow from all
    </IfModule>
</Files>

Options -Indexes

# Папка в корне не должна красть адрес у движка.
#
# Из-за этого установщик однажды стал недоступен: рядом лежала папка
# samples (тогда она называлась install), сервер увидел каталог, добавил
# косую черту — и до PHP запрос уже не дошёл.
<IfModule mod_dir.c>
    DirectorySlash Off
</IfModule>

<FilesMatch "^\.">
    <IfModule mod_authz_core.c>
        Require all denied
    </IfModule>
</FilesMatch>
