.htaccess 重写规则并阻止特定文件夹的文件访问

问题描述

我在名为“members”的子文件夹中有一个迷你 PHP 应用程序,所以 domain.com/members

在这个迷你应用程序中,我在 .htaccess 文件中有以下内容重定向 URL,例如 domain.com/members/categories/some-category 或 domain.com/members/login 等。

RewriteEngine On
RewriteBase /

# allow passthru to existing files/dirs
RewriteCond %{REQUEST_URI} !^/members/app  [OR]
RewriteCond %{REQUEST_URI}  ^/members/app/assets
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]

# everything else rewrite
RewriteRule ^(.*) members/index.PHP

这允许我的资产文件夹加载(CSS、JavaScript 和图像)并允许任何实际的文件 URL。但是,我们有一个文件夹,其中包含我们现在需要保护的文件

因此,如果有人要访问 domain.com/members/files/filename.pdf 这将是服务器上的实际文件,我们需要将此 URL 重写到 members/index.PHP 文件中,因为我们需要检查权限在允许下载之前在文件上。

每当我尝试删除以下行时,一切都会中断:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d

解决方法

您可以在站点根目录 .htaccess 中使用此代码:

RewriteEngine On

RewriteRule ^members/index\.php$ - [L,NC]

RewriteRule ^members/files/ members/index.php [L,NC]

RewriteCond %{REQUEST_URI} !^/members/app/assets [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ members/index.php [L]