Это текущая папка:
/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>
Заранее спасибо.
Если это ваша основная проблема: «У меня повсюду конфиденциальные данные»
Самый простой и надежный вариант - переместить эти конфиденциальные данные куда-нибудь за пределы корневого веб-сайта. ..
Рассмотрим корневой веб-каталог (ваш 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
.
Директивы
и
нацелены только на файлы , а не на каталоги. Если у вас есть доступ к конфигурации сервера, вы, возможно, использовали бы контейнер
.
В .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 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 и установка переменной среды, если запрашивается один из разрешенных URL-путей, и разрешение доступа только в том случае, если эта переменная env установлена.
Например:
SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED
Вышеуказанное устанавливает ] ALLOWED
env var, если запрашивается любой из разрешенных URL-путей. Директива Require
затем требует, чтобы эта переменная env была установлена для предоставления доступа, в противном случае возвращается 403.
Вот как:
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.