如何告訴 .htaccess 只允許 index.php 和 app/dist/* 資料夾的請求?

如何告訴 .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/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.phpDirectoryIndexindex.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/

請注意OrderAllowDeny、 等是較舊的 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指令(最好在主伺服器設定檔中,或者如果您更喜歡.htaccessWeb 根目錄中的檔案)或 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.comDocumentRootforwww.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。

相關內容