.htaccess 不重写现有文件

.htaccess not rewriting existing files

我试图通过 php 文件路由所有请求并检查登录和权限来限制对我网站特定部分的访问。

我有一个文件夹 (/doc),其中包含各种 .html 文件,mod_rewrite 我将所有有效文件重定向到 .php 文件根(现在只打印一个测试字符串)。

这是我的 .htaccess:

# BEGIN WordPress
# Le direttive (linee) tra `BEGIN WordPress` e `END WordPress` sono
# generate dinamicamente, e dovrebbero essere modificate solo tramite i filtri di WordPress.
# Ogni modifica alle direttive tra questi marcatori verrà sovrascritta.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
 RewriteCond %{REQUEST_URI} !/(wp-content/uploads/.*)$
 RewriteCond %{REQUEST_URI} !/(doc/.*)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
RewriteCond %{HTTP_HOST} ^mywebsite\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.mywebsite\.com$
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^webmail$ "https\:\/\/mywebsite\.mywebsite\.com\:2096\/" [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^doc/(.*)$ /dl-file.php?file= [QSA,L]

最后两行应该将所有有效文件的 URL 重写到 php 文件。

发生的情况是文件夹 (mywebsite.com/doc/) 可以正常工作,但我不明白为什么。而对于 .html 文件 (mywebsite.com/doc/index.html) 它只是显示它们而不加载 .php

it's not a caching issue, I've cleaned the cache, tried in incognito mode, other browsers, smartphone. I've moved the RewriteRule up and down, removed the RewriteCond, nothing seems to work. For non-existing files I get the redirect to my .php file, while existing files just get server rightaway...

忽略了您在当前指令中进行文件检查(即 %{REQUEST_FILENAME} -f)的事实(因此不存在的文件不应定向到您的 PHP 脚本,除非您请求错误 URL 或您在测试中删除了此条件)...

看起来您可能有一个前端代理(也许是 Nginx?)来提供静态文件?这是一个相对常见的设置,但这意味着您的应用程序服务器 (Apache) 完全绕过静态文件请求,因此您的指令甚至不会被直接文件请求处理。

在不调整您的前端代理的情况下,解决方法是将您的文件移动到不同的目录,但保持 URL 相同,并使用 Apache 检查此文件是否存在而不是正在请求的 URL。 (或者,更改您的 URLs。)

例如,您可以将文件移动到 /actual-files 子目录(或者理想情况下文档根目录上方的某个位置*1).因此,对 /doc/myfile.html 的请求实际上是指 /doc/actual-files/myfile.html,但由于 /doc/myfile.html 实际上并不存在,因此前端代理不会触及它。

# Block direct access to `/doc/actual-files/`
RewriteRule ^doc/actual-files - [F]

# Rewrite "/doc/file" requests to download script
RewriteCond %{DOCUMENT_ROOT}/doc/actual-files/ -f
RewriteRule ^doc/(.*)$ /dl-file.php?file= [QSA,L]

但是,您将需要更改指令的顺序,并且应避免手动更改 # BEGIN WordPress 部分中的代码。

所以,这变成了...

# Block direct access to `/doc/actual-files/`
# >>> BUT PROXY SERVER WILL STILL HAVE ACCESS (*1)
RewriteRule ^doc/actual-files - [F]

# Redirect HTTP to HTTPS here...

# Rewrite "/doc/file" requests to download script
RewriteCond %{DOCUMENT_ROOT}/doc/actual-files/ -f
RewriteRule ^doc/(.*)$ /dl-file.php?file= [QSA,L]

# Webmail (website.website.com???)
RewriteCond %{HTTP_HOST} ^(www\.)?mywebsite\.com$
RewriteRule ^webmail$ "https://mywebsite.mywebsite.com:2096/" [R=301,L]

# Prevent certain directories being routed through WordPress
RewriteCond %{REQUEST_URI} /wp-content/uploads/ [OR]
RewriteCond %{REQUEST_URI} /doc/
RewriteRule ^ - [L]

# BEGIN WordPress
# Le direttive (linee) tra `BEGIN WordPress` e `END WordPress` soon
# generate dinamicamente, e dovrebbero essere modificate solo tramite i filtri di WordPress.
# Ogni modifica alle direttive tra questi marcatori verrà sovrascritta.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

旁白:在重写下载脚本(当前配置中缺少)之前,您需要确保请求通过 HTTPS。

*1 将文件移动到 public 子目录仍将允许代理服务器直接访问这些文件(如果用户找到真实的文件系统路径)。为避免此“安全问题”,您需要将文件移动到文档根目录之上 - public HTML space.

之外