Apache-2.4
禁止除位於子文件夾中的腳本之外的所有內容
example.com
除了位於特定路徑(例如 )上的某些入口點(此處為 PHP 文件)外,我想禁止特定域(例如 )上的所有內容example.com/subfolder1/subfolder2/script.php
。這是我在我的虛擬主機中為這個特定域使用的配置片段。我仍然得到403的一切。
對於上下文,我使用的是 Apache 2.4.41 + FPM 7.2
<VirtualHost *:443> ServerName example.com DocumentRoot /my/path <Directory /my/path> RewriteEngine on RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2$ RewriteRule . - [F,L] </Directory> </VirtualHost>
RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2$ RewriteRule . - [F,L]
由於字元串結尾的錨點 (
$
),這僅允許/subfolder1/subfolder2
( 不/subfolder1/subfolder2/script.php
) 並阻止其他所有內容。由於/subfolder1/subfolder2
可能是一個物理目錄,因此 mod_dir 將重定向以附加尾部斜杠,然後該斜杠將被此規則阻止。所以是的,它確實阻止了一切。您需要從CondPattern
$
的末尾刪除字元串末尾的錨點 ( ) 。例如:RewriteCond %{REQUEST_URI} !^/subfolder1/subfolder2
雖然,嚴格來說,為了避免與可能只是以
subfolder2
(例如subfolder2foo.php
)開頭的任何內容髮生衝突,那麼您應該使用類似的正則表達式^/subfolder1/subfolder2($|/)
。請注意,如果這是您需要允許的唯一 URL 路徑,則不需要條件,因為應該直接在
RewriteRule
指令中執行測試。例如:RewriteRule !^/subfolder1/subfolder2($|/) - [F]
L
標誌不需要帶F
標誌;這是暗示的。或者,根本不要使用 mod_rewrite。例如:
<Directory /my/path> Require all denied </Directory> <Directory /my/path/subfolder1/subfolder2> Require all granted </Directory>
這比 mod_rewrite 更可取,除非您有其他要求。