我有這個目錄結構:
./project/
├── docs/
├── framework/
├── .git/
├── .gitignore
├── .htaccess
└── web/
地址:
http://demo.example.com/project或http://project.demo.example.com
我的專案前端檔案在web路徑中。
我想阻止對檔案夾以外的所有檔案和檔案夾的訪問web。
顯然這應該由.htaccess.
最初有使用Directoryor 的解決方案DirectoryMatch,但不允許在.hatccess. 所以我不得不使用RewriteRule.
我也不希望它與project名稱相關聯。
我找到了這個命令:
RewriteRule (docs|framework|\.git|\.gitignore|\.htaccess)(/.*)?$ - [F,NC]
這看起來不錯。
回傳403 Forbidden列出的地址。它也適用于子檔案夾。
但主要問題是檔案夾可能會改變。所以我決定更改策略并將其命名為除web.
為此,我寫了這個:
RewriteRule (?!web)(/.*)?$ - [F,NC]
但這并不涵蓋所有情況。
事實上,它適合所有模式!
為了更快地測驗,您可以使用此鏈接或此示例鏈接。
uj5u.com熱心網友回復:
使用 Apache,您可以通過簡單地在正則運算式(或運算式)前面加上!(感嘆號)來否定它。
例如,要阻止除 start 之外的所有 URL,/project/web/您可以在/project/.htaccess檔案中使用以下內容:
RewriteRule !^web/ - [F]
如果.htaccess檔案位于/project子目錄中,則無需指定project/前綴,因為RewriteRule 模式匹配的 URL 路徑是相對于.htaccess檔案位置的。
這需要靠近.htaccess檔案頂部。
RewriteRule (?!web)(/.*)?$ - [F,NC]
或者,在正則運算式中使用負前瞻(注意:Apache 使用 PCRE,而不是正則運算式的“Java 8”風格)。
你錯過了字串錨的開始。但是斜杠將不匹配,因為負前瞻斷言實際上不匹配任何內容(并且RewriteRule 模式匹配的 URL 路徑不以斜杠開頭)。
您可以改用以下內容:
RewriteRule ^(?!web($|/)) - [F]
我們實際上不需要匹配任何東西,正則運算式只需要“成功”即可觸發指令并阻止請求。例如
或者,您可以改用 mod_authz_core。例如:
# /project/.htaccess
# Block access to everything
Require all denied
在子目錄中創建一個附加訪問檔案/web:
# /project/web/.htaccess
# Allow access
Require all granted
或者,您可以/project/.htaccess使用 Apache<If>運算式 (Apache 2.4) 來完成這一切。雖然這有點復雜,因為它可以通過project子域或子目錄訪問,并且我們正在匹配整個 URL 路徑。例如:
# /project/.htaccess
# Block everything except the "/web" subdirectory
<If "%{REQUEST_URI} !~ m#^(/[^/] )?/web($|/)#">
Require all denied
</If>
運算子!~與正則運算式不匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420687.html
標籤:
上一篇:正則運算式掃描檔案以獲取特定內容
