Ich habe festgestellt, dass beim externen Klicken auf einen Link über den Webbrowser, z. B. aus Excel oder Word, mein Sitzungscookie zunächst nicht erkannt wird, selbst wenn der Link in einem neuen Tab desselben Browserfensters geöffnet wird.
Der Browser erkennt schließlich sein Cookie, aber ich bin verwirrt, warum dieser erste Link aus Excel oder Word nicht funktioniert. Um es noch schwieriger zu machen, funktioniert das Klicken auf einen Link in Outlook einwandfrei.
Weiß jemand, warum dies passieren könnte? Ich verwende das Zend Framework mit PHP 5.3.
Antworten:
Dies liegt daran, dass MS Office die Komponente Hlink.dll verwendet, um zu prüfen, ob es sich bei dem Link um ein Office-Dokument oder etwas anderes handelt. MS Office erwartet, dass das in Dokumenten verknüpfte Dokument ohne die Hilfe eines externen Browsers geöffnet wird (mithilfe der Hlink.dll-Komponente von IE6).
Wenn ein Sitzungscookie die Website schützt, wird Hlink natürlich zur Anmeldeseite umgeleitet und hat die HTML-Seite erreicht und kann sie nicht "verstehen". Sie öffnet sie in einem externen Browser. Beachten Sie, dass nicht die ursprüngliche URL (erwartetes Verhalten) geöffnet wird, sondern das Ergebnis der Umleitung, selbst wenn es sich um eine 302-Umleitung handelte.
Microsoft hat diesen Fehler in einer nicht unterstützten Komponente (Hlink.dll), anstatt den Fehler zu erkennen, den sie uns übergeben (um uns davon zu überzeugen, dass es sich um einen Fehler des von uns verwendeten SSO-Systems handelt, dh um Sitzungscookies), und weigert sich, ihn zu aktualisieren. Es bietet eine Problemumgehung, mit der die Suchfunktion von MS Office deaktiviert wird :
Oder bieten Sie uns an, die Server-Seite zu umgehen, um HTTP-Weiterleitungen zu vermeiden und in Javascript-Weiterleitungen oder META REFRESH-Weiterleitungen zu wechseln (dh, Hlink muss eine Text- / HTML-Seite auf die ursprüngliche URL übertragen und einen externen Browser ausführen, um damit umzugehen).
quelle
HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\9.0\Common\Internet\
, und ja, es ist immer noch9.0
auch für MS Office 2013wow6432node
wie oben angegeben, wenn Sie 32-Bit-Office verwenden.Wir hatten das gleiche Problem und haben ein Open-Source-Juwel geschrieben, um denjenigen zu helfen, die Rails verwenden: https://github.com/spilliton/fix_microsoft_links
Sie können jedoch denselben Ansatz verwenden, den wir für jedes Framework verwendet haben:
Beispielcode hier: https://github.com/spilliton/fix_microsoft_links/blob/master/lib/fix_microsoft_links.rb
quelle
Serverseitig funktionierte dies für mich in IIS (unter Verwendung einer Umschreiberegel)
quelle
Fix für VB.NET:
Grundsätzlich wird der Browser gezwungen, die Seite zu aktualisieren, sodass die Anfrage beim Benutzeragenten des Browsers und allen korrekten Cookies eingeht.
quelle
Hier ist eine Lösung für C # ASP.NET basierend auf der obigen Antwort von spilliton. Fügen Sie in Global.asax.cs Folgendes hinzu:
quelle
PHP-Lösung:
Dies verhindert, dass das MS-Produkt die Weiterleitung erkennt. MS startet daher einen Browser über den erforderlichen Link.
.. nach diesem Code umleiten
quelle
1.Von Excel / Word-Punkt auf http://example.com/from_excel.php
2.In "from_excel.php" leiten Sie zu der Seite weiter, auf der Sie die Sitzung verwenden
quelle
So umgehen Sie dies mit Java und Spring über einen Filter:
/** * To see why this is necessary, check out this page: * https://support.microsoft.com/en-gb/help/899927. */ public class MicrosoftFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException { //Serve up a blank page to anything with a Microsoft Office user agent, forcing it to open the //URL in a browser instead of trying to pre-fetch it, getting redirected to SSO, and losing //the path of the original link. if (!request.getHeader("User-Agent").contains("ms-office")) { filterChain.doFilter(request, response); } } } /** * Security configuration. */ @Configuration public class SecurityConfiguration { @Bean public FilterRegistrationBean microsoftFilterRegistrationBean() { FilterRegistrationBean<MicrosoftFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MicrosoftFilter()); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } }
quelle
Wir sehen ein Problem, dass ZWEI Chrome-Registerkarten geöffnet werden, wenn Sie auf eine URL aus MS Word klicken, und die zu öffnende Seite über eine JavaScript-Umleitung verfügt:
window.location.href=blabla
Durch das Debuggen von der Serverseite haben wir bestätigt, dass neben Chrome auch Anforderungen von der Office-App gesendet werden. Das ist so komisch.
Durch Überprüfen des Anforderungsheaders "User-Agent" und Zurückgeben einer leeren Seite an Office-Apps wurde das Problem mit den beiden Registerkarten behoben. Das ist definitiv das Richtige!
quelle
Hier ist ein Beispiel für das Update mit einer Dotnet-Core-Middleware:
public class MicrosoftOfficeLinksHandlingMiddleware { private static readonly Regex MsUserAgentsRegex = new Regex(@"[^\w](Word|Excel|PowerPoint|ms-office)([^\w]|\z)"); private readonly RequestDelegate _next; public MicrosoftOfficeLinksHandlingMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { string userAgent = context.Request.Headers["User-Agent"].FirstOrDefault(); if (userAgent != null && MsUserAgentsRegex.IsMatch(userAgent)) { // just return an empty response to the office agent return; } await _next(context); } }
quelle
Hier ist meine Lösung dafür in WordPress. Fügen Sie dies zu functions.php in Ihrem Theme oder einer anderen Plugin-Datei hinzu.
Dies kann hilfreich sein, wenn Ihr System wie WP abgemeldete Benutzer an eine Anmeldeseite mit einer Umleitung zu der Seite sendet, auf die sie zugreifen wollten. Word hat Benutzer auf diese Seite gesendet, aber dann hat WP den Fall, in dem ein Benutzer bereits angemeldet war, nicht richtig behandelt. Dieser Code prüft, ob ein aktueller Benutzer und ein Parameter redirect_to übergeben wurden. In diesem Fall wird an den Speicherort redirect_to weitergeleitet.
quelle
Hier ist ein VBA-Fix für Excel. Das gleiche Konzept kann für Microsoft Word angewendet werden. Anstatt den Link in Excel auszulösen, führt der Code den Link im Grunde genommen in einer Shell aus. Hier ist der Code:
Ein paar Anmerkungen:
quelle
Ich kann nicht glauben, dass sie dies eine Funktion nennen. Hier ist jedoch ein Featurefix für Apache:
In Bezug auf die Leistung ist dies möglicherweise nicht die beste Leistung, da die gesamte Seite anstelle einer leeren Antwort gesendet wird, aber ich wollte keine weiteren Apache-Module hinzufügen, nur um eine solche idio ^ H ^ H ^ H ^ H-Funktion zu beheben.
quelle
NGINX-Lösung unten:
Sie können es in den
server
oderlocation
Block setzen. Funktioniert wie Charme.quelle
Ich musste dieses Problem für eine ASP.NET-Site lösen, wollte aber nur Javascript / jQuery verwenden:
Ich habe die gup-Funktion erhalten von: Wie erhalte ich den Wert aus dem URL-Parameter?
quelle
Verwenden Sie den von Microsoft bereitgestellten Fix unter dem folgenden Link. https://support.microsoft.com/en-us/kb/218153
quelle
Ich vermute, dies hängt davon ab, wie Sie die Cookies setzen.
Aufgrund der Art und Weise, wie das Web erstellt wurde, wird example.com nicht als dieselbe Domain angesehen wie
www.example.com
; daher: Sie können bei angemeldetwww.example.com
und nicht angemeldet sein beiexample.com
.Mit anderen Worten, überprüfen Sie die URL in Ihrer Word- oder Excel-Datei. Entspricht dies der Domain, mit der Sie in Ihrem Browser angemeldet sind?
Es gibt zwei Korrekturen / Lösungen für diese Cookie-Inkonsistenz: 1. Leiten Sie jeden weiter, der versucht, Ihre Site ohne das WWW zu laden. auf die gleiche Seite mit dem www. (oder umgekehrt) oder 2. Wenn Sie das Cookie setzen, stellen Sie sicher, dass Sie das Domain-Argument als ".example.com" angeben. Der führende Punkt gibt an, dass das Cookie auch für alle Subdomains dieser Domain gültig sein sollte.
Ich vermute, der Grund, warum der Browser dies irgendwann erkennt, liegt darin, dass Sie wahrscheinlich auf einer URL landen, die dieselbe Domain-Struktur aufweist wie Sie.
Hoffe das hilft.
quelle