使用 mod_rewrite - htaccess - regex 解码重写的 URL

使用 mod_rewrite - htaccess - regex 解码重写的 URL

我正在使用 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
  1. 首先RewriteRule 内部重写请求(仍在您的服务器上):

    /redirect/forms%2Fd%2Fe%2F1234567890%2Fviewform
    

    AllowEncodedSlashes On由于您在服务器配置中设置的指令,这是“允许的”(并且不会触发 404) 。

  2. 然后,第二个服务器RewriteRule解码 URL 路径(%2F/)并发出外部重定向到:

    https://docs.google.com/forms/d/e/1234567890/viewform
    

    Apache 自动对 URL 路径进行 URL 解码,然后RewriteRule 图案被应用。相关部分被捕获并传递到代换$1反向引用中。

相关内容