Removing port 443 from urls generated by Sitecore
For as long as I've been working on Sitecore there has been this really annoying issue where setting the link manager to include server url and running under https will cause urls to be generated with the port number included. e.g. https://www.himynameistim.com:443/ which naturally you don't actually want.
To overcome this there are a few methods you can take.
Method 1 - Set the Scheme and Port on you site defenition
This is possibly the smallest change you can make as it's just 2 settings in a config file.
Setting the external port on site node to 80 (yes 80) tricks the link manager code into not appending the port number as it does it for everything other than port 80.
1<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">2 <sitecore>3 <sites xdt:Transform="Insert">4 <site name="website">5 <patch:attribute name="hostName">www.MySite.com</patch:attribute>6 <patch:attribute name="rootPath">/sitecore/content/MySite</patch:attribute>7 <patch:attribute name="scheme">https</patch:attribute>8 <patch:attribute name="externalPort">80</patch:attribute>9 </site>10 </sites>11 </sitecore>12</configuration>
What I don't like about this method though, is your setting something to be wrong to get something else to come out right. It's all a bit wrong.
Method 2 - Write your own link provider
The second method which I have generally done is to write your own provider which strips the port number off the generated URL.
For this you will need:
1. A patch file to add the provider:
1<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">2 <sitecore>3 <linkManager defaultProvider="sitecore">4 <patch:attribute5 name="defaultProvider"6 value="CustomLinkProvider" />7 <providers>8 <add name="CustomLinkProvider"9 type="MySite.Services.CustomLinkProvider,10 MySite"11 languageEmbedding="never"12 lowercaseUrls="true"13 useDisplayName="true"14 alwaysIncludeServerUrl="true"15 />16 </providers>17 </linkManager>18 <mediaLibrary>19 <mediaProvider>20 <patch:attribute name="type">21 MySite.Services.NoSslPortMediaProvider, MySite22 </patch:attribute>23 </mediaProvider>24 </mediaLibrary>25 </sitecore>26</configuration>
2. A helper method that removes the SSL port
1namespace MySite2{3 /// <summary>4 /// Link Helper is used to remove SSL Port5 /// </summary>6 public static class LinkHelper7 {8 /// <summary>9 /// This method removes the 443 port number from url10 /// </summary>11 /// <param name="url">The url string being evaluated</param>12 /// <returns>An updated URL minus 443 port number</returns>13 public static string RemoveSslPort(string url)14 {15 if (string.IsNullOrWhiteSpace(url))16 {17 return url;18 }1920 if (url.Contains(":443"))21 {22 url = url.Replace(":443", string.Empty);23 }2425 return url;26 }27 }28}
3. The custom link provider which first gets the item URL the regular way and then strips the SSL port
1using Sitecore.Data.Items;2using Sitecore.Links;34namespace MySite5{6 /// <summary>Provide links for resources.</summary>7 public class CustomLinkProvider : LinkProvider8 {9 public override string GetItemUrl(Item item, UrlOptions options)10 {11 // Some code which manipulates and exams the item...1213 return LinkHelper.RemoveSslPort(base.GetItemUrl(item, options));14 }15 }16}17
4. The same provider for media
1using Sitecore.Data.Items;2using Sitecore.Resources.Media;34namespace MySite5{6 /// <summary>7 /// This method removes SSL port number from Media Item URLs8 /// </summary>9 public class NoSslPortMediaProvider : MediaProvider10 {11 /// <summary>12 /// Overrides Url mechanism for Media Items13 /// </summary>14 /// <param name="item">Sitecore Media Item</param>15 /// <param name="options">Sitecore Media Url Options object</param>16 /// <returns>Updated Media Item URL minus 443 port</returns>1718 public override string GetMediaUrl(MediaItem item, MediaUrlOptions options)19 {20 var mediaUrl = base.GetMediaUrl(item, options);21 return LinkHelper.RemoveSslPort(mediaUrl);22 }23 }24}
What I don't like about this method is it's messy in the opposite way. The port number is still being added, and we're just adding code to try and fix it after.
Credit to Sabo413 for the code in this example
Method 3 - Official Sitecore Patch
Given that it's Sitecore's bug, it does actually make sense that they fix it. After all people are paying a license fee for support! This simplifies your solution down to 1 extra patch file and a dll. What's better is as it's Sitecores code they have the responsibility of fixing it, if it ever breaks something, and you have less custom code in your repo.
You can get the fix here for Sitecore version 8.1 - 9.0.
So this may leave you wondering how did Sitecore fix it? Well having a look inside the dll reveals they wen't for method 2.