我们有一个运行在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);
我甚至将测试网址从浏览器复制到NPP中并查看为十六进制。似乎没有任何额外的角色。
如果我在浏览器栏中手动输入相同的网址,一切都会完美无缺。
这仅适用于需要身份验证的网址,公共/前端网址似乎不受影响。这导致我this answer,但我不确定它是否适用于我们的情况。在浏览器中打开这些URL之前,Microsoft确实在运行Microsoft Office Protocol Discovery,但我们的身份验证cookie正在被识别(浏览器会打开登录页面,但如果用户拥有有效的cookie,则会立即重定向到帐户区域)。
还有其他人经历过这个吗?我还能看到其他原因吗?
答案 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]