希望:/test → 內部重寫至 /test.php 正常執行
但直接訪問 /test.php → 回傳 403 Forbidden
RewriteEngine On RewriteRule ^test$ /test.php [L] RewriteRule ^test\.php$ - [F,L]
流程:
/test → 匹配第 1 條 → 內部重導向至 /test.php^test\.php$ → 觸發 [F] → 403結論:內部重寫同樣會經過 Rewrite 規則檢查,導致自我封鎖。
RewriteCond %{REDIRECT_URL} ^$
RewriteRule .* - [F,L]
實測 %{REDIRECT_URL} 在 Apache 內部重寫中永遠為空,無法作為判斷依據。
在 PHP 入口檔案或全域引用檔最頂端加入:
<?php
if (empty($_SERVER['REDIRECT_URL'])) {
header('HTTP/1.1 403 Forbidden');
exit('Forbidden: Direct access not allowed');
}
// 正常業務邏輯
?>
原理:內部重寫後,Apache 會設定 REDIRECT_URL 為原始請求 URI;直接訪問 PHP 則為空。
FilesMatch 封鎖:
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
<Location "/test">
Require all granted
</Location>
需 Apache 2.4+,配合 mod_rewrite 內部重寫可繞過 FilesMatch
location ~ \.php$ { internal; } 僅允許內部請求若仍在 Apache + 傳統 PHP 專案,採用 $_SERVER['REDIRECT_URL'] 判斷為最低成本方案;新專案強烈建議採用框架單一入口或遷移至 Nginx。