I recently came across an interesting routing issue in SitecoreAI where enabling useDisplayName started generating much cleaner URLs, but those URLs were returning 404 in the rendering host.
The interesting part was that the same pages worked perfectly when accessed using their original item-name based URLs.
The Requirement
The team I was helping had category pages with URLs like:
https://testing.mysite.com/Products/1341592/1342427/1342434
These URLs are technically valid, but they aren't particularly user-friendly.
The preferred URL was something like:
https://testing.mysite.com/Products/category1 display name/category2 display name
/category3 display name
In Sitecore, this can be achieved by configuring the link provider to use the item's display name when generating URLs.
The Configuration Change
We deployed the following Sitecore configuration patch in the staging environment:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<linkManager defaultProvider="switchableLinkProvider">
<providers>
<add
name="localizedProvider"
patch:attribute="useDisplayName"
useDisplayName="true" />
</providers>
</linkManager>
</sitecore>
</configuration>
After deploying the patch, Sitecore started generating URLs using display names, for example:
https://staging.mysite.com/Products/category1 display name/category2 display name/category3 display name
So far, everything looked correct.
The Problem
The problem appeared when opening the newly generated URL.
The display-name URL returned:
404
However, the same page could still be opened using its original item-name based URL.
/Products/1341592/1342427/1342434
This made the problem particularly interesting because Sitecore was able to generate the display-name URL, but the rendering host could not correctly resolve the same URL back to the Sitecore item.
Environment Comparison
There was also an interesting difference between the staging and testing environments.
In staging, the useDisplayName configuration had been deployed.
In testing, it had not.
The behavior looked like this:
| Environment | Item Name URL | Display Name URL |
|---|---|---|
| Testing | Works | Works |
| Staging | Works | 404 |
This initially made the configuration patch look like the obvious cause.
Content SDK vs JSS SDK
One important detail in this investigation was that the rendering host was using the Sitecore Content SDK, not the JSS SDK.
This became important because some of the Sitecore documentation around display-name routing specifically discusses JSS Next.js applications and its routing behavior.
So it was necessary to distinguish between:
- How Sitecore generates the URL
- How the rendering host receives the URL
- How the incoming URL is converted into a Sitecore route
- How the route is ultimately resolved through Sitecore's APIs
Simply enabling useDisplayName="true" changes URL generation. It does not necessarily mean that every part of the rendering host's route-resolution process will automatically understand the new display-name based path.
The Investigation
We shared the behavior with Sitecore Support and provided examples of both working and failing routes.
One of the useful tests was to compare the GraphQL layout query using the two different route paths.
The display-name route was:
/Products/category1 display name/category2 display name/category3 display name
while the original item-name route was:
/Products/1341592/1342427/1342434
The same test could then be performed using the different context IDs for Preview and Live.
This helped narrow the problem down to route resolution rather than the actual page content.
Sitecore Confirmed the Bug
After investigating the issue, Sitecore Support confirmed that the behavior was related to a known product issue.
The Sitecore bug reference is:
DP-2604
Sitecore described the issue as:
Layout query with name route path fails if page has display name.
Sitecore also confirmed that their developer team was working on a fix.
The Workaround
In our case, the practical workaround was to avoid relying on the display name for the category path.
We updated the implementation so that categories were created using their name rather than the category ID, and we removed the display-name configuration.
This allowed the URLs to remain readable without depending on the problematic display-name route resolution.
The workaround was confirmed to be effective, and Sitecore Support advised continuing to track the issue using the bug reference DP-2604.
What I Learned From This
This was a good reminder that URL generation and URL resolution are two different parts of the problem.
It is possible for Sitecore to generate a perfectly valid-looking URL while the rendering host or downstream API cannot resolve that URL back to the correct item.
When introducing display-name based URLs, I would therefore test both sides:
- Is Sitecore generating the expected URL?
- Can the rendering host resolve that URL?
- Does the corresponding Layout API or GraphQL query resolve the route?
- Does the behavior differ between Preview and Live context?
- Does the same route work when the display-name configuration is removed?
In this case, the issue turned out not to be an application implementation problem but a Sitecore product bug.
Conclusion
If you are using SitecoreAI and enable useDisplayName, but your newly generated display-name URLs return 404 while the original item-name URLs continue to work, it is worth checking whether you are hitting the same issue.
The relevant Sitecore bug reference is:
DP-2604
The workaround in our case was to use category names rather than category IDs and remove the display-name configuration until the underlying issue is resolved.
This is one of those Sitecore issues where the symptom initially looks like a rendering-host routing problem, but the actual problem can be deeper in the route resolution performed by the Sitecore platform.
Hopefully this saves someone else a few hours of debugging.
Comments
Post a Comment