我有点愚蠢的必要性,将PDF文件的链接伪装成PHP文件,并以PDF文件名作为参数。
像这样:
- 客户端请求 xxxx.pdf 文件。
- 服务器收到请求,但不返回 xxxx.pdf而是转到 yyyy.php 或任何扩展名。
- 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扩展时,重定向更容易。
所以我基本上是这样做的:
- .htaccess检测PDF扩展名并重定向到PHP文件,将不带扩展名的文件名作为参数传递。
- php 文件使用文件名并使用
header
和readfile
渲染 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);