現在のフォルダは次のとおりです:
/app
/dist
/index.html
/index.css
/index.js
/src
/configurations.json
/index.php
/configurations.php
あらゆる場所に機密データがあります。
app/src/...
/...
ユーザーがアクセスできるようにしたいのは以下のとおりです。
index.php
app/dist/whateverfile.whateverformat
フォルダーdist
は変更される可能性があるため、このディレクトリに静的にアクセスできるようにして、すべてのファイルをリストする必要がないようにする必要があります。
この構文でこれをどのように行うのでしょうか.htaccess
?
にアクセスできるようにするこの構成がありますindex.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>
前もって感謝します。
答え1
および指令は<Files>
、<FilesMatch>
ファイルディレクトリではありません。サーバー構成にアクセスできる場合は、おそらくコンテナーを使用します<Directory>
。
mod_rewriteの使用
では、 mod_rewrite を使用して、または.htaccess
以外へのアクセスを制限できます。/index.php
/app/dist/
例えば:
RewriteEngine On
RewriteRule !^(index\.php$|app/dist/) - [F]
/index.php
上記は、 ではない、または を開始しないリクエストに対して 403 Forbidden で応答します/app/dist/
。 代わりに 404 を返す場合は、F
に変更しますR=404
。
正規表現のプレフィックス!
は正規表現を否定します。RewriteRule
パターンスラッシュで始まっていません。
実際のファイルまたはディレクトリにマップされるリクエストに対してのみ 403 で応答したい場合 (それ以外の場合は 404)、ファイルシステムをチェックする条件をいくつか追加します (ただし、ファイルシステムのチェックは比較的コストがかかるため、必要がない限り使用しないでください)。例:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]
要求されたURLが許可された「グループ」に含まれていない場合のみそしてファイルまたはディレクトリにマップされるのは、RewriteRule
アクションされるディレクティブです。
ただし、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>
/
上記は、 ではない、/index.php
または で始まるURL リクエストに対して 403 で応答します/app/dist/
。
Order
、、Allow
などDeny
は古い Apache 2.2 ディレクティブであり、Apache 2.4 では正式に非推奨になっていることに注意してください。
mod_setenvif の使用
別の方法としては、mod_setenvif を使用して、許可された URL パスの 1 つが要求された場合に環境変数を設定し、この環境変数が設定されている場合にのみアクセスを許可するという方法があります。
例えば:
SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED
上記は、ALLOWED
許可された URL パスのいずれかが要求された場合に env var を設定します。Require
その後、ディレクティブはアクセスを許可するにはこの env var を設定する必要があります。そうでない場合は 403 が返されます。
答え2
これが主な問題である場合:「機密データはどこにでもあります」
これは、その機密情報を Web ルートの外部に移動することで、最も簡単かつ確実に解決されます...
のみを含むWeb ルート ( DocumentRoot
)を考えてみましょうindex.php
。そこに他のデータがない場合、それを保護するための複雑なルールも必要ありません...
例えば、Alias
ディレクティブ (メイン サーバー構成ファイル内、または Web ルート内のファイル内が望ましい.htaccess
) または mod_rewrite ルールを使用して、DocumentRoot ディレクトリ/ファイル外のディレクトリに保存されているドキュメントに URI をマップし、アクセスを明示的に許可します。
つまり
.
`-- 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
、参考文献.
は.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"
Alias "/app/dist" "/some-path/app/dist"
または、ディレクティブ内の正規表現をより具体的にしたり、創造的に使用したりしますAlaisMatch
。
答え3
こうやって:
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に移行しました。