這是當前資料夾:
/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
.
正規表示式上的前綴!
否定正規表示式。請注意,URL 路徑匹配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 路徑之一時設定環境變量,並且僅在設定了此環境變數時才允許存取。
例如:
SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED
ALLOWED
如果請求任何允許的 URL 路徑,上面的程式碼會設定環境變數。然後,該Require
指令要求設定此環境變數以授予存取權限,否則將傳回 403。
答案2
如果這是您的主要問題:“我到處都有敏感數據”
透過將敏感資訊移至網路根目錄之外的某個位置,可以最簡單、最可靠地解決這個問題...
考慮一個網絡根目錄(您的DocumentRoot
)僅包含index.php
當其中沒有其他資料時,您也不需要任何複雜的規則來保護它...
然後您可以使用例如Alias
指令(最好在主伺服器設定檔中,或者如果您更喜歡.htaccess
Web 根目錄中的檔案)或 mod_rewrite 規則,將 URI 對應到儲存在 DocumentRoot 目錄/檔案之外的目錄中的文檔,以明確允許存取。
IE
.
`-- 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
forwww.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"
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。