【发布时间】:2022-01-11 00:14:17
【问题描述】:
我想重写所有带有尾随“.pdf”的 URL,以打开 mozilla.pdf.js 中的 pdf 文件,并在我的 HTTP 虚拟主机上成功地测试了 RewriteRule 和 RewriteCond(我在 ubuntu 服务器上使用 apache2) :
要重写的示例 URL:
http://server-test.local/downloads/dir2/file5/test.pdf
重写后的示例目标 URL:
http://server-test.local/libs/mozilla.pdf.js/web/viewer.html?file=/downloads/dir2/file5/test.pdf
RewriteCond %{HTTP_REFERER} !viewer.html
RewriteRule ^(.+)(\.pdf)$ http://server-test.local/libs/mozilla.pdf.js/web/viewer.html?file=$1 [R=301,L]
所以RewriteCond 阻止了另一个重定向,这将导致mozilla.pdf.js 尝试加载自身而不是PDF 文件并导致错误。 (对不起,如果描述不清楚,我不是很喜欢这个话题)
现在我尝试为我的其他虚拟主机 (https) 应用完全相同的 RewriteCond 和 RewriteRule,除了 SSL 和 Kerberos 实现之外,它与“服务器测试”虚拟主机完全相同:
RewriteCond %{HTTP_REFERER} !viewer.html
RewriteRule ^(.+)(\.pdf)$ https://server-prod.local/libs/mozilla.pdf.js/web/viewer.html?file=$1 [R=301,L]
但似乎不知何故 RewriteCond 不适用。结果是,重定向到mozilla.pdf.js 有效,但不会呈现PDF,并且会出现mozilla.pdf.js 的错误(“无效的PDF 结构”),因为-这是我的理论-还有另一个重定向,所以mozilla.pdf.js 不会加载/渲染pdf,而是尝试加载自己的viewer.html。
我也尝试了以下RewriteConds,但没有一个人改变了行为:
RewriteCond %{REQUEST_URI} !viewer.html*
RewriteCond %{REQUEST_URI} !^/libs/mozilla.pdf.js/web/viewer.html*
RewriteCond !viewer.html
我使用这些RewriteConds 的目的是防止另一个(循环)重定向,如果重写之前的 URL 包含字符串“viewer.html”,那么如果[...]/viewer.html?file=/downloads/dir2/file5/test.pdf 是REQUEST_URI,则不应再重写发生。
有人可以向我解释一下,为什么 RewriteCond 可以在测试虚拟主机 (HTTP) 上运行,但不能在生产虚拟主机 (HTTPS) 上运行?除了 SSL 和 SSL 安全虚拟主机具有 Kerberos 实现这一事实外,这两个虚拟主机、它们的目录和配置大多相同。 SSL是问题吗?有谁知道我如何在 SSL 虚拟主机上解决这个问题?我需要以某种方式找到解决方案...
我将不胜感激各种提示/帮助。
【问题讨论】:
标签: apache mod-rewrite url-rewriting pdf.js