2017-02-14 3 views
1

У нас есть приложение, работающее на PHP 5.5 & Laravel 5.2. Он имеет область учетной записи пользователя, в которой все маршруты имеют префикс/account /. Маршрутом по умолчанию для области учетной записи является/account/services. Пользователи перенаправляются на эту страницу по умолчанию после входа в систему.Маршрутизация не работает должным образом при щелчке по URL в Word или Excel (PHP, Laravel)

Конечно, если пользователь вводит URL-адрес определенной учетной записи, такой как example.com/account/billing, они переходят на страницу фактурирования при входе в систему (или напрямую, если они уже прошли проверку подлинности).

Однако, если я нажму https://example.com/billing в Excel или Word, я перейду на страницу по умолчанию/учетная запись/услуги (если аутентифицирован, в противном случае я туда туда после входа в систему).

Сначала я считал, что это связано с тем, что они вставляют скрытые символы и таким образом аннулируют URL-адрес, заставляя наше приложение маршрутизировать пользователя по умолчанию.

Так что я попробовал эти решения:

  • trim() URL-адрес
  • Удаление неразрывные пробелы: $url = preg_replace('~\x{00a0}~','',$reqURL);
  • функцию, чтобы удалить метку порядка байтов (Sourced here)

Я даже скопировали тестовые URL-адреса из браузера в АЭС и считались шестнадцатеричными. Кажется, нет никаких дополнительных символов.

Если я вручную ввожу один и тот же URL-адрес в панель браузера, все работает отлично.

Это происходит только для URL-адресов, для которых требуется аутентификация, общедоступные/внешние URL-адреса кажутся незатронутыми. Это привело меня к this answer, но я не уверен, что это применимо в нашем случае. Microsoft действительно запускает обнаружение протоколов Microsoft Office, прежде чем открывать эти URL-адреса в браузере, но наш cookie-аутентификация распознается (браузер открывается на страницу входа в систему, но сразу же перенаправляется в область учетной записи, если у пользователя есть действительный файл cookie).

Неужели кто-нибудь еще испытал это? И на какие другие причины я мог смотреть?

ответ

0

Пользовательский агент Microsoft действительно был виновником.

Я решил это с помощью правила .htaccess, которое возвращает ответ 200 на запросы агентов, связанных с Office. (Раньше 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] 

Я также попытался это правило, которое возвращает «Method Not Allowed» ответ агента пользователя MS Office Protocol, но это не решило проблему.

# 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]