2015-10-19 69 views
1

我發送包含有指向角前端應用程序的確認令牌的註冊確認網址註冊激活郵件的剝離部分:郵件客戶端的角度網址

... <a href="https://domain.com/#/confirm-signup?token=1234...">Activate</a> ...

請注意,令牌是JWT,並且相當長。

這工作發現對於大多數用戶,但對於鏈路上的某些點擊他們帶到https://domain/com只是沒了confirm-signup?token=...

它好像郵件客戶端可以在#後剝離一切,但我可​​以」沒有找到任何其他人有這個問題的證據,我也不能複製它。

到目前爲止,我的最好猜測是,一些郵件客戶端看到#,並以某種方式將尾部作爲內部錨點並將其剝離...?

有其他人遇到過這種問題嗎?如果是這樣,你有沒有找到任何解決方案,用其他方法取代整個機制?

+0

是的,我以前也遇到過,因爲#的這個問題,我們在那裏試圖鏈接到一個錨上的LandingPage .. –

回答

1

一些客戶端對待hash-link就好了。其他人沒有。有一個關於Outlook在這裏被骯髒的話題:Outlook strips URL hash from email

我們在我們公司做的解決這個問題的方法就是在我們的服務器上創建一個重定向的處理程序。您的電子郵件鏈接將變爲http://domain.com/email-link?url=https%3A%2F%2Fdomain.com%2F%23%2Fconfirm-signup%3Ftoken%3D1234,您的服務器端腳本將抓取查詢參數url並立即觸發重定向。

您需要確保找到電子郵件中的所有鏈接並將其替換。這裏有一個PHP函數,但是你可以用你使用的任何後端語言來做到這一點。正則表達式在這裏可能會有所幫助。

function replaceLinks($html,$hash) { 
    return preg_replace_callback('/<a [^>]*href=[\"\']{1}(.+?)[\"\\\']{1}/', function($matches) use ($hash) { 
     return str_replace($matches[1],"http://domain.com/email-link?url=".rawurlencode($matches[1]),$matches[0]); 
    }, $html); 
} 
+0

中包含'#'的絕對url。我懷疑這是是最可靠的解決方案。在短期內,我們已經使用了一個簡短的鏈接,但是它帶來了它自己的問題,被gmail等人所詬病。我們目前的角度應用程序沒有服務器端組件,所以這個解決方案將是一個我們實施的一點痛苦。 –

+0

@PeterWhitfield你可以很容易地在前端設置重定向腳本,只需查看查詢參數,然後用'window.location'重定向即可。 –

0

是的我之前遇到過這個問題,因爲#我試圖鏈接到目標頁上的一個錨。我的解決方案最終使用了short.url服務來將#從html中「隱藏」 https://goo.gl/

+0

是你只使用本地錨(即:'HREF =「#... 「')? Campaign Monitor在這種情況下有一篇關於變量行爲的文章,我懷疑對於某些客戶端來說,它不僅僅是用'#'盯着錨,而且有時包括在字符串 –

0

看起來像你需要的percent encoding

很多時候,當你的href被解析(在這種情況下是角度),它不處理特殊字符或刪除它們。找到您的問題字符並將其替換爲%3F代替?,%26代替&和%23代替#。其餘的都在鏈接的圖表中。

一旦編碼地址命中瀏覽器,url將在您的url欄中解碼。