如果文件存在,则重定向到某个文件,否则从 htaccess 重定向到 404

如果文件存在,则重定向到某个文件,否则从 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

    • 如果存在文件,但不存在这个.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

答案1

重定向到 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则对的请求应返回 403。).htaccess

第二条规则为所有其他“直接”请求提供 404 错误。检查环境变量的初始条件REDIRECT_STATUS确保我们只检查直接请求,而不检查重写的请求(由较早的重写)。因此这包括:

  • 直接请求download.php(但不重写请求download.php)。
  • 直接请求目录。
  • 该请求未映射到文件(因为第一条规则已经失败)。

相关内容