-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Check url with locale prefixes and compare with redirectSlug #16
Conversation
…ting to redirectSlug and not page url
PRO-4493 Redirect/Localization Issues: Prefixes are removed before consulting redirects
When we are using the redirect module on a site on which we have locale prefixes, it does not work as intended. When you want to redirect a French page like /fr/auto, you cannot because if /auto exists in the EN locale, it will remove the prefix before consulting the redirects. https://gitlab-dcadcx.michelin.net/pa/apostrophe-enhancements/-/issues/1223 |
index.js
Outdated
const status = (parsedCode && !isNaN(parsedCode)) ? parsedCode : 302; | ||
|
||
if (target.urlType === 'internal' && target._newPage && target._newPage[0]) { | ||
return req.res.redirect(status, target._newPage[0].slug); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Modified to take target._newPage[0].slug
instead of target._newPage[0]._url
because I was ended with redirection to pages like /fr/fr/page
since the locale prefix is automatically added.
Didn't see potential issues by using slug.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use rawRedirect
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
if (isNaN(status) || !status) { | ||
status = 302; | ||
} | ||
const target = results.find(({ redirectSlug }) => redirectSlug === slug) || |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same logic as before here just condensed and avoid two useless iterations (some
in the if statements).
index.js
Outdated
} | ||
const slug = req.originalUrl; | ||
const [ pathOnly ] = slug.split('?'); | ||
const results = await self.find(req, { $or: [ { redirectSlug: slug }, { redirectSlug: pathOnly } ] }).toArray(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I get redirections with and without query params. Then I still perform a find on both depending on the ignoreQueryString
property.
I don't think we need a regex here, or maybe just to remove the last slash?
BTW using redirectSlug
instead of slug
here because with the latter it doesn't work when slug is deduplicated, by an archived piece for example.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm saying "uncle" here. Using slug
for speed is just too messy. So please add a mongodb database index on redirectSlug
. See the doc module for examples.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uncle? Ok doing that.
index.js
Outdated
} | ||
const slug = req.originalUrl; | ||
const [ pathOnly ] = slug.split('?'); | ||
const results = await self.find(req, { $or: [ { redirectSlug: slug }, { redirectSlug: pathOnly } ] }).toArray(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm saying "uncle" here. Using slug
for speed is just too messy. So please add a mongodb database index on redirectSlug
. See the doc module for examples.
index.js
Outdated
const status = (parsedCode && !isNaN(parsedCode)) ? parsedCode : 302; | ||
|
||
if (target.urlType === 'internal' && target._newPage && target._newPage[0]) { | ||
return req.res.redirect(status, target._newPage[0].slug); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use rawRedirect
.
index.js
Outdated
if (target.urlType === 'internal' && target._newPage && target._newPage[0]) { | ||
return req.res.redirect(status, target._newPage[0].slug); | ||
} else if (target.urlType === 'external' && target.externalUrl.length) { | ||
return req.res.redirect(status, target.externalUrl); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rawRedirect here too.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
Reminder that this request for changes is pending. |
CHANGELOG.md
Outdated
@@ -1,5 +1,9 @@ | |||
# Changelog | |||
|
|||
## Unreleased | |||
|
|||
- Fixes redirections when using locales prefixes. The locale prefix must be added to the `redirectSlug` to avoid conflicts with other locales. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
locale prefixes
const slug = req.originalUrl; | ||
const [ pathOnly ] = slug.split('?'); | ||
const results = await self | ||
.find(req, { $or: [ { redirectSlug: slug }, { redirectSlug: pathOnly } ] }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This may be a slight performance hit, but OK. Time to make this code simple.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You think it's less efficient than a regex query?
I added an index on redirectSlug
also.
PRO-4495
PRO-4493
Summary
originalUrl
instead ofurl
in which the locale prefix has been removed.$or
request on redirect piecesredirectSlug
property because there was issues when using the slug since this one can be modified by the server for de duplication for example.slug
property instead of the_url
of the new page to avoid being redirected on pages like/fr/fr/page
.What are the specific steps to test this change?
On project with multiple locales using prefixes, when creating a new redirection, you must specify the locale prefix, it allows to avoid conflicts with potential pieces with the same slug in other locales.
What kind of change does this PR introduce?
Make sure the PR fulfills these requirements: