在Word或Excel中单击URL时,路由无法正常工作(PHP,Laravel)

时间:2017-02-14 08:17:51

标签: php laravel-5

我们有一个运行在PHP 5.5& Laravel 5.2。它有一个用户帐户区,其中所有路由都以/ account /为前缀。帐户区域的默认路由是/ account / services。登录后,用户默认路由到此页面。

当然,如果用户输入特定的帐户区域网址(例如example.com/account/billing),则会在登录时将其转到结算页面(如果已经过身份验证,则会直接转到结算页面。)

但是,如果我在Excel或Word中单击https://example.com/billing,我会转到默认/帐户/服务页面(如果已通过身份验证;否则我会在登录后转到此处)。

起初我认为这是因为他们插入了隐藏的字符,从而使URL无效,导致我们的应用程序将用户路由到默认URL。

所以我尝试了这些解决方案:

  • trim()网址
  • 删除不间断空格:$url = preg_replace('~\x{00a0}~','',$reqURL);
  • 删除字节顺序标记的函数(来源here

我甚至将测试网址从浏览器复制到NPP中并查看为十六进制。似乎没有任何额外的角色。

如果我在浏览器栏中手动输入相同的网址,一切都会完美无缺。

这仅适用于需要身份验证的网址,公共/前端网址似乎不受影响。这导致我this answer,但我不确定它是否适用于我们的情况。在浏览器中打开这些URL之前,Microsoft确实在运行Microsoft Office Protocol Discovery,但我们的身份验证cookie正在被识别(浏览器会打开登录页面,但如果用户拥有有效的cookie,则会立即重定向到帐户区域)。

还有其他人经历过这个吗?我还能看到其他原因吗?

1 个答案:

答案 0 :(得分:0)

微软的用户代理确实是罪魁祸首。

我使用.htaccess规则解决了这个问题,该规则对来自Office相关用户代理的请求返回200响应。 (之前,Laravel正在返回302重定向到登录页面,因为这些路由需要身份验证。)这会欺骗Office打开带有预期URL的浏览器(如果它们未经过身份验证,它们仍然会重定向到登录表单,但是登录后重定向现在可以很好地工作了。)

# Return 200 to Microsoft Office user agents to resolve redirection issue
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} MSOffice [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Microsoft\ Office\ Word [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Office [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Microsoft\ Office\ PowerPoint [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ms\-office [NC]
RewriteRule .* - [R=200,L]

我还尝试了这条规则,该规则向MS Office协议用户代理返回“方法不允许”响应,但它没有解决问题。

# Intercept Microsoft Office Protocol Discovery
RewriteCond %{REQUEST_METHOD} ^OPTIONS
RewriteCond %{HTTP_USER_AGENT} ^Microsoft\ Office\ Protocol\ Discovery [OR]
RewriteCond %{HTTP_USER_AGENT} ^Microsoft\ Office\ Existence\ Discovery [OR]
RewriteCond %{HTTP_USER_AGENT} ^Microsoft\-WebDAV\-MiniRedir.*$
RewriteRule .* - [R=405,L]