Как указать .htaccess разрешать только запросы к index.php и папке app / dist / *?

Это текущая папка:

/app
  /dist
    /index.html
    /index.css
    /index.js
  /src
    /configurations.json
/index.php
/configurations.php

У меня везде конфиденциальные данные:

  • app / src / ...
  • / ...

Я хочу, чтобы иметь доступ только к:

  • index.php
  • app / dist / Anyfile.whateverformat

Папка dist может изменяться, поэтому я должен разрешить им доступ к этому каталогу статически, поэтому Мне не нужно перечислять каждый файл.

Как это можно сделать с помощью синтаксиса .htaccess ?

У меня есть такая конфигурация, которая позволяет мне получить доступ к индексу . php . Но нет подсказки, как это сделать для папки dist ...

Options -Indexes
DirectoryIndex index.php

<FilesMatch ".*">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

<Files index.php>
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

<Files "">
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

Заранее спасибо.

0
задан 9 December 2020 в 16:25
3 ответа

Если это ваша основная проблема: «У меня повсюду конфиденциальные данные»

Самый простой и надежный вариант - переместить эти конфиденциальные данные куда-нибудь за пределы корневого веб-сайта. ..

Рассмотрим корневой веб-каталог (ваш DocumentRoot ), который содержит только index.php
. Когда в нем нет других данных, вам не нужны никакие сложные правила для защиты либо ...


Затем вы можете использовать, например, директиву Alias ​​ (желательно в файле конфигурации основного сервера, или если вы предпочитаете файл .htaccess в корневом веб-каталоге ) или правила mod_rewrite для сопоставления URI с документами, хранящимися в каталогах вне ваших каталогов / файлов DocumentRoot, чтобы специально разрешить доступ.

т.е.

.
`-- some-path
    |-- app
    |   `-- dist
    |       |-- index.css
    |       |-- index.html
    |       `-- index.js
    |-- src
    |   `-- configurations.json
    `-- www.example.com
        |-- .htaccess
        `-- index.php

Где ваша основная конфигурация apache определяет /some-path/www.example.com как DocumentRoot для www.example.com .
Тогда .htaccess может быть чем-то вроде этого, предоставляя каталог / some-path / app / и все его содержимое как путь URI http://www.example.com/app/

# /some-path/www.example.com/.htaccess
# exposes/some-path/app/ directory  as the URI path `http://www.example.com/app/`

Alias "/app" "/some-path/app"

Или, точнее, с Псевдонимом "/ app / dist" "/ some-path / app / dist" или креативом с регулярным выражением в директиве AlaisMatch .

1
ответ дан 4 January 2021 в 09:23

Директивы и нацелены только на файлы , а не на каталоги. Если у вас есть доступ к конфигурации сервера, вы, возможно, использовали бы контейнер .

Использование mod_rewrite

В .htaccess вы можете использовать mod_rewrite для ограничения доступа на что-либо, кроме /index.php или / app / dist / .

Например:

RewriteEngine On

RewriteRule !^(index\.php$|app/dist/) - [F]

Вышеупомянутое ответит 403 Запрещено для любого запроса, который не /index.php или не запускается / app / dist / . Если вы хотите вместо этого вернуть 404, измените F на R = 404 .

Префикс ! в регулярном выражении отменяет регулярное выражение. Обратите внимание, что URL-путь, соответствующий шаблону RewriteRule , не начинается с косой черты.

Если вы хотите отвечать 403 только на запросы, которые будут отображаться на фактические файлы или каталоги ( и 404 в противном случае), затем добавьте пару условий, которые проверяют файловую систему (но обратите внимание, что проверки файловой системы относительно дороги, поэтому не используйте их, если они вам не нужны). Например:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]

Директива RewriteRule действует только в том случае, если запрошенный URL не входит в разрешенную «группу» и , сопоставленную с файлом или каталогом.

Однако я будет предполагать, что ваши URL-адреса на самом деле не содержат index.php (не так ли?), и в этом случае пользователь запрашивает / , а mod_dir выдает внутренний подзапрос для / index. php ( DirectoryIndex ). В этом случае вам необходимо сделать index.php необязательным.

Например:

RewriteRule !^((index\.php)?$|app/dist/) - [F]

Использование выражения Apache

В качестве альтернативы вы можете сделать это с помощью выражения Apache (Apache 2.4)

<If "%{REQUEST_URI} !~ m#^/((index\.php)?$|app/dist/)#">
    Require all denied
</If>

Вышеупомянутое отвечает 403 на любой запрос URL, который не является / , /index.php или начинается с / app / dist / .

Обратите внимание, что Order , Allow , Deny и т. Д. Являются более старыми директивами Apache 2.2 и официально устарели в Apache 2.4.


Использование mod_setenvif

Другой альтернативой является использование mod_setenvif и установка переменной среды, если запрашивается один из разрешенных URL-путей, и разрешение доступа только в том случае, если эта переменная env установлена.

Например:

SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED

Вышеуказанное устанавливает ] ALLOWED env var, если запрашивается любой из разрешенных URL-путей. Директива Require затем требует, чтобы эта переменная env была установлена ​​для предоставления доступа, в противном случае возвращается 403.

1
ответ дан 4 January 2021 в 09:23

Вот как:

Options -Indexes
ServerSignature Off 
DirectoryIndex index.php

RewriteEngine on
RewriteRule ^ui(/)?$ app/dist/index.html [QSA,END,NC,L]
RewriteRule ui/(.*) app/dist/$1 [QSA,END,NC,L]
RewriteRule !(ui/.*) index.php [QSA,END,NC,L]

Обратите внимание на флаг END после каждого совпадения. Этот флаг требуется для имитации типичного синтаксиса if-else . Но это не задокументировано в официальной документации.

Я наконец перешел на Node.js.

0
ответ дан 4 January 2021 в 09:23

Теги

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