我正在使用 Apache 2.4。我已经设置并配置了一个 Apache HTTP 服务器来托管我的 invision 应用程序,我的应用程序链接到外部 google 文档。我试图从应用程序重定向到外部 google 文档,但 Apache 不喜欢它。
这是它尝试访问的 URL
http://example.com/redirect?
url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
我使用以下内容重写了 URL:
RewriteCond %{QUERY_STRING} ^(.+)(forms.+)
RewriteRule ^redirect(.*) https://docs.google.com/%2 [R=302,QSD]
重写之后,只剩下这个。
https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform
它按预期工作,如果我亲自将 %2F 替换为“/”,它会带我到文档,所以我知道它已经接近了。URL 重定向到 Google Drive,只有我得到了
404页面不存在
来自 Google Drive 的消息。我知道我需要解码 URL 才能成功访问文档,但是如何使用 .htaccess 或任何其他方式来做到这一点?
AllowEncodedSlahes on (I have also tried NoDecode) //VirtualHost conf and apache conf
我尝试使用正则表达式匹配和替换 %2F,但它们无法识别,并且出现 500 - 内部服务器错误。
我知道这似乎是一个持续存在的错误/问题,但有人能解决这个极其痛苦的问题吗?我对此束手无策,谢谢。
答案1
重写之后,只剩下这个。
https://docs.google.com/forms%2Fd%2Fe%2F12345678900%Fviewform
尽管这种情况不会发生在您发布的指令中,除非您还在指令中包含NE
( noescape
) 标志RewriteRule
。(相反,它将是双重编码)。使用NE
标志是朝着正确方向迈出的一步,但是,我们还需要另一个步骤来对生成的 URL 路径进行 URL 解码……
边注:您在上面发布的 URL 路径结果有拼写错误(考虑到您的示例输入 URL)。%2F
缺少最后一个;相反,您有0%F
。它应该是:forms%2Fd%2Fe%2F1234567890%2Fviewform
Google 似乎会因为 URL 路径中的编码斜杠而触发 404(正如您所建议的那样),就像 Apache 默认所做的那样。设置AllowEncodedSlashes On
(在 vHost 中)不会立即解决这个问题,因为 404 是由 Google 触发的。但是,确实需要设置它,以便我们可以进一步处理 URL 并取消编码编码的斜杠,然后再发出最终重定向。
请尝试以下操作:
# Set in your vhost (server config)
AllowEncodedSlashes On
然后,在.htaccess
(或适当的<Directory>
部分):
RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.+)(forms.+)
RewriteRule ^redirect$ /redirect/%2 [NE,QSD]
RewriteRule ^redirect/(.+) https://docs.google.com/$1 [R=302,L]
因此,考虑到最初的请求你的服务器的:
/redirect?url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1234567890%2Fviewform
首先
RewriteRule
内部重写请求(仍在您的服务器上):/redirect/forms%2Fd%2Fe%2F1234567890%2Fviewform
AllowEncodedSlashes On
由于您在服务器配置中设置的指令,这是“允许的”(并且不会触发 404) 。然后,第二个服务器
RewriteRule
解码 URL 路径(%2F
到/
)并发出外部重定向到:https://docs.google.com/forms/d/e/1234567890/viewform
Apache 自动对 URL 路径进行 URL 解码,然后
RewriteRule
图案被应用。相关部分被捕获并传递到代换在$1
反向引用中。