Apache-2.4

禁止除位於子文件夾中的腳本之外的所有內容

  • March 28, 2022

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 更可取,除非您有其他要求。

引用自:https://serverfault.com/questions/1097217