使用 .htaccess 伪装.pdf扩展名,避免循环


Disguising .pdf extension using .htaccess avoiding cycling

我有点愚蠢的必要性,将PDF文件的链接伪装成PHP文件,并以PDF文件名作为参数。

像这样:

  1. 客户端请求 xxxx.pdf 文件。
  2. 服务器收到请求,但不返回 xxxx.pdf而是转到 yyyy.php 或任何扩展名。
  3. yyyy.php 有一个加载 PDF 文件的 iframe。

问题是我设法做到了第 2 点。 但是当我尝试做第 3 点时,它要么循环,要么找不到文件。

我正在考虑有一个自定义扩展名来"模拟"另一个文件,以便不循环,但它仍在循环。

我有以下.htaccess:

AddType application/pdf         .view
RewriteRule ^(.*)'.pdf$         yyyy.php?filename=$1 [L]
RewriteRule ^(.*)'.view$        $1.pdf [L]

问题是它循环往复,我一无所获。

我不太擅长.htaccess,所以我哪里做错了?

您可能需要添加一些内容以防止yyyy.php的引用被重写 php 文件。在 yyyy.php 规则之前添加以下内容:

RewriteCond %{HTTP_REFERER} !yyyy'.php

请注意,引用可以伪造,因此这是人们能够绕过 yyyy.php 文件的一种方法。

我发现当我检测到.pdf扩展时,重定向更容易。

所以我基本上是这样做的:

  1. .htaccess检测PDF扩展名并重定向到PHP文件,将不带扩展名的文件名作为参数传递。
  2. php 文件使用文件名并使用 headerreadfile 渲染 PDF,以避免与 .htaccess 发生冲突。

像这样:

.htaccess

RewriteRule     ^(.*)'.pdf$     /pdfreader/$1 [L,R=302,NC]
RewriteRule     ^pdfreader/(.*)?$           pdfreader.php?file=$1 [L,NC]

PDF阅读器.php

$file = $_GET["file"].".pdf";
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $file . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');
@readfile($file);