Dot-Htaccess
如果文件存在,則重定向到某個文件,否則從 htaccess 重定向到 404
我有這棵樹:
libs/ html/ app/ uploads/ files/ images/ male.png female.png .htaccess download.php .htaccess index.php
/.htaccess
有這個內容:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -Indexes </IfModule> RewriteEngine On RewriteRule ^ index.php [END,L] </IfModule>
我想
/uploads/.htaccess
:
重定向到
download.php
- 如果存在文件,但不是這個
.htaccess
或download.php
重定向 404
- 如果不匹配現有文件
- 或匹配
.htaccess
或download.php
- 或匹配現有文件夾
例子:
www.example.com/uploads - redirect 404 www.example.com/uploads/files - redirect 404 www.example.com/uploads/images- redirect 404 www.example.com/uploads/.htaccess - redirect 404 www.example.com/uploads/download.php - redirect 404 www.example.com/uploads/nonexistentfile - redirect 404 www.example.com/uploads/images/male.php - redirect download.php www.example.com/uploads/images/female.php - redirect download.php
重定向到download.php
我假設您的意思是“重寫”,而不是外部“重定向”。
我假設您的系統(即伺服器配置)已經配置(使用 mod_authz_…)在嘗試
.htaccess
直接訪問時返回 403 Forbidden。我會保持原樣,除非您有特定要求返回 404。重定向到 404
澄清一下,您並沒有真正“重定向”到 404,您只是“服務”了 404。如果您重定向到 404,那麼您首先會向客戶端發送 3xx 響應,這是不可取的。
在
/uploads/.htaccess
文件中嘗試以下操作:RewriteEngine On # Rewrite request to download.php RewriteCond %{REQUEST_FILENAME} -f RewriteRule !download\.php$ download.php [L] # Serve a 404 otherwise... RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^ - [R=404]
第一條規則將所有尚未
download.php
作為物理文件存在的請求重寫為download.php
. (假設伺服器配置正確,請求.htaccess
應該返回 403。)第二條規則為所有其他“直接”請求提供 404。檢查環境變數的初始條件
REDIRECT_STATUS
確保我們只檢查直接請求而不是重寫請求(通過較早的重寫)。所以這包括:
- 直接請求
download.php
(但不重寫請求download.php
)。- 直接請求目錄。
- 該請求未映射到文件(因為第一條規則會失敗)。