Dot-Htaccess

如果文件存在,則重定向到某個文件,否則從 htaccess 重定向到 404

  • July 16, 2019

我有這棵樹:

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

    • 如果存在文件,但不是這個.htaccessdownload.php
  • 重定向 404

    • 如果不匹配現有文件
    • 或匹配.htaccessdownload.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)。
  • 直接請求目錄。
  • 該請求未映射到文件(因為第一條規則會失敗)。

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