gfrizzle
gfrizzle

Reputation: 12609

Sitecore adding port numbers to all URLs

Wondering if anyone has seen this behavior before. My instance of Sitecore 6.6 appends the port number to all the URLs it generates for my site. So for example, a link to the home page should be "https://example.org", but instead it's generated as "https://example.org:443". Everything functions fine with the port numbers, but it's muddling some stuff we're trying to do with SEO and canonicalization. Does anyone know if there's a setting or setup to not produce the port numbers? (I'm sure I could rewrite the URLs by catching them at the appropriate point in the pipeline, but I'm hoping for a simpler way before I jump to that.)

Upvotes: 6

Views: 4362

Answers (5)

sitecorepm
sitecorepm

Reputation: 101

It's a known bug: https://kb.sitecore.net/articles/913585

There is a patch for releases below 9.1 available here: https://github.com/SitecoreSupport/Sitecore.Support.93141/releases

Upvotes: 2

Chris Elston
Chris Elston

Reputation: 11

I agree with Jan's findings: setting externalPort on the site node in the configuration convinces Sitecore to exclude the port in a generated URL. I did a full write-up on my blog, including using the result for canonical URL tags.

http://findgnosis.com/2017/06/26/hiding-port-urls-produced-sitecores-linkmanager/

Upvotes: 1

Jan Sommer
Jan Sommer

Reputation: 3798

LinkManager: You can cheat the LinkManager by adding port="443" externalPort="80" to your site-definition in <sites>. Don't know if this will cause other issues though.

<configuration>
  <sitecore>
    <sites>
      <site name="website" port="443" externalPort="80" />
    </sites>
  </sitecore>
</configuration>

MediaManager: If you know the url, set the Media.MediaLinkServerUrl-setting, to prevent Sitecore from creating the wrong url. Otherwise...

class SslFriendlyMediaProvider : MediaProvider
{
    public override string GetMediaUrl(MediaItem item, MediaUrlOptions options)
    {
        var url = base.GetMediaUrl(item, options);

        if(options.AlwaysIncludeServerUrl)
            // https://example.com:443/a b?c=123 --> https://example.com/a%20b?c=123
            return new Uri(url).AbsoluteUri;

        return url;
    }
}

Config:

<configuration xmlns:set="http://www.sitecore.net/xmlconfig/set/">
  <sitecore>
    <mediaLibrary>
      <mediaProvider set:type="SslFriendlyMediaProvider, Assembly" />
    </mediaLibrary>
  </sitecore>
</configuration>

Upvotes: 0

medkg15
medkg15

Reputation: 1595

This is caused by having the 'scheme' property in the configuration/sitecore/sites/site element of the web.config (or patched config) being set to 'http' explicitly, but making requests over SSL. Removing this, or setting it to 'https' resolves the issue.

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <sites>
      <site patch:before="*[@name='website']"
                name="my_website"
                hostName="my_website.com"
                scheme="http" 
                ...
    </sites>
  </sitecore>
</configuration>   

Upvotes: 3

Kevin Brechb&#252;hl
Kevin Brechb&#252;hl

Reputation: 4727

The Sitecore LinkManager is indeed not so clever. We also experienced this issue with a mix of proxy servers and load balancers. To remove the ports, we have created a custom LinkProvider which removes the port if needed (untested code sample):

public class LinkProvider : Sitecore.Links.LinkProvider
{
   public override string GetItemUrl(Item item, UrlOptions options)
   {
      var url = base.GetItemUrl(item, options);
      if (url.StartsWith("https://"))
      {
         url = url.Replace(":443", string.Empty);
      }

      return url;
   }
}

And configure the new LinkProvider:

<configuration xmlns:set="http://www.sitecore.net/xmlconfig/set/">
  <sitecore>
    <linkManager defaultProvider="sitecore">
      <providers>
        <add name="sitecore" set:type="Website.LinkProvider, Website" />
      </providers>
    </linkManager>
  </sitecore>
</configuration>

Upvotes: 7

Related Questions