hrefs for /users/:username without a trailing / lead to django kicking back a redirect to /users/:username/ This activity leads to scratch-www-production having 40-60% redirects. It would be useful to clear this noise up for SRE related operations.

This commit is contained in:
Colby Gutierrez-Kraybill 2025-04-18 18:28:05 -04:00
parent 9cbb1a9c57
commit 2aa64c075d
12 changed files with 23 additions and 23 deletions

View file

@ -67,7 +67,7 @@ const OnboardingHeader = ({user, section, secondary}) => {
className="profile-page-image" className="profile-page-image"
src="/images/onboarding/profile-page-become-a-scratcher-button.svg" src="/images/onboarding/profile-page-become-a-scratcher-button.svg"
/> />
<a href={`/users/${user.username}`}> <a href={`/users/${user.username}/`}>
<Button> <Button>
<FormattedMessage <FormattedMessage
id={'becomeAScratcher.buttons.backToProfile'} id={'becomeAScratcher.buttons.backToProfile'}

View file

@ -31,7 +31,7 @@ class ContactUs extends React.Component {
} else if (query.indexOf('profile=') !== -1) { } else if (query.indexOf('profile=') !== -1) {
scratchId = query.match(/profile=([a-zA-Z0-9-_]+)/)[1]; scratchId = query.match(/profile=([a-zA-Z0-9-_]+)/)[1];
this.state.subject = `Issue reported with profile ${scratchId}`; this.state.subject = `Issue reported with profile ${scratchId}`;
this.state.body = `https://scratch.mit.edu/users/${scratchId}`; this.state.body = `https://scratch.mit.edu/users/${scratchId}/`;
} else if (query.indexOf('confirmation=') !== -1) { } else if (query.indexOf('confirmation=') !== -1) {
this.state.subject = 'Problem with email confirmation'; this.state.subject = 'Problem with email confirmation';
} }

View file

@ -161,7 +161,7 @@ class CommentMessage extends React.Component {
{this.getMessageText(this.props.objectType, this.props.commentee)} {this.getMessageText(this.props.objectType, this.props.commentee)}
</p> </p>
<FlexRow className="mod-comment-message"> <FlexRow className="mod-comment-message">
<a href={`/users/${this.props.actorUsername}`}> <a href={`/users/${this.props.actorUsername}/`}>
<img <img
alt={`${this.props.actorUsername}'s avatar`} alt={`${this.props.actorUsername}'s avatar`}
className="comment-message-info-img" className="comment-message-info-img"

View file

@ -21,7 +21,7 @@ const FavoriteProjectMessage = props => (
profileLink: ( profileLink: (
<a <a
className="social-messages-profile-link" className="social-messages-profile-link"
href={`/users/${props.actorUsername}`} href={`/users/${props.actorUsername}/`}
> >
{props.actorUsername} {props.actorUsername}
</a> </a>

View file

@ -21,7 +21,7 @@ const LoveProjectMessage = props => (
profileLink: ( profileLink: (
<a <a
className="social-messages-profile-link" className="social-messages-profile-link"
href={`/users/${props.actorUsername}`} href={`/users/${props.actorUsername}/`}
> >
{props.actorUsername} {props.actorUsername}
</a> </a>

View file

@ -21,7 +21,7 @@ const RemixProjectMessage = props => (
profileLink: ( profileLink: (
<a <a
className="social-messages-profile-link" className="social-messages-profile-link"
href={`/users/${props.actorUsername}`} href={`/users/${props.actorUsername}/`}
> >
{props.actorUsername} {props.actorUsername}
</a> </a>

View file

@ -18,7 +18,7 @@ const FavoriteProjectMessage = props => (
id="messages.favoriteText" id="messages.favoriteText"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${props.actorUsername}`}> <a href={`/users/${props.actorUsername}/`}>
{props.actorUsername} {props.actorUsername}
</a> </a>
), ),

View file

@ -18,7 +18,7 @@ const RemixProjectMessage = props => (
id="messages.remixText" id="messages.remixText"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${props.actorUsername}`}> <a href={`/users/${props.actorUsername}/`}>
{props.actorUsername} {props.actorUsername}
</a> </a>
), ),

View file

@ -18,7 +18,7 @@ const ShareProjectMessage = props => (
id="messages.shareText" id="messages.shareText"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${props.actorUsername}`}> <a href={`/users/${props.actorUsername}/`}>
{props.actorUsername} {props.actorUsername}
</a> </a>
), ),

View file

@ -27,7 +27,7 @@ const getComponentForItem = item => {
id="studio.activityAddProjectToStudio" id="studio.activityAddProjectToStudio"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
), ),
@ -53,7 +53,7 @@ const getComponentForItem = item => {
id="studio.activityRemoveProjectStudio" id="studio.activityRemoveProjectStudio"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
), ),
@ -79,7 +79,7 @@ const getComponentForItem = item => {
id="studio.activityUpdateStudio" id="studio.activityUpdateStudio"
values={{ values={{
profileLink: ( profileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
) )
@ -101,12 +101,12 @@ const getComponentForItem = item => {
values={{ values={{
// Beware, DB seems to think actor is new curator and username is inviter // Beware, DB seems to think actor is new curator and username is inviter
newCuratorProfileLink: ( newCuratorProfileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
), ),
inviterProfileLink: ( inviterProfileLink: (
<a href={`/users/${item.username}`}> <a href={`/users/${item.username}/`}>
{item.username} {item.username}
</a> </a>
) )
@ -127,12 +127,12 @@ const getComponentForItem = item => {
id="studio.activityRemoveCurator" id="studio.activityRemoveCurator"
values={{ values={{
removedProfileLink: ( removedProfileLink: (
<a href={`/users/${item.username}`}> <a href={`/users/${item.username}/`}>
{item.username} {item.username}
</a> </a>
), ),
removerProfileLink: ( removerProfileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
) )
@ -153,12 +153,12 @@ const getComponentForItem = item => {
id="studio.activityBecomeOwner" id="studio.activityBecomeOwner"
values={{ values={{
promotedProfileLink: ( promotedProfileLink: (
<a href={`/users/${item.recipient_username}`}> <a href={`/users/${item.recipient_username}/`}>
{item.recipient_username} {item.recipient_username}
</a> </a>
), ),
promotorProfileLink: ( promotorProfileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
) )
@ -180,7 +180,7 @@ const getComponentForItem = item => {
id="studio.activityBecomeHostAdminActor" id="studio.activityBecomeHostAdminActor"
values={{ values={{
newHostProfileLink: ( newHostProfileLink: (
<a href={`/users/${item.recipient_username}`}> <a href={`/users/${item.recipient_username}/`}>
{item.recipient_username} {item.recipient_username}
</a> </a>
) )
@ -190,12 +190,12 @@ const getComponentForItem = item => {
id="studio.activityBecomeHost" id="studio.activityBecomeHost"
values={{ values={{
newHostProfileLink: ( newHostProfileLink: (
<a href={`/users/${item.recipient_username}`}> <a href={`/users/${item.recipient_username}/`}>
{item.recipient_username} {item.recipient_username}
</a> </a>
), ),
actorProfileLink: ( actorProfileLink: (
<a href={`/users/${item.actor_username}`}> <a href={`/users/${item.actor_username}/`}>
{item.actor_username} {item.actor_username}
</a> </a>
) )

View file

@ -37,7 +37,7 @@ const StudioMemberTile = ({
const [transferHostModalOpen, setTransferHostModalOpen] = useState(false); const [transferHostModalOpen, setTransferHostModalOpen] = useState(false);
const [managerLimitReached, setManagerLimitReached] = useState(false); const [managerLimitReached, setManagerLimitReached] = useState(false);
const {errorAlert, successAlert} = useAlertContext(); const {errorAlert, successAlert} = useAlertContext();
const userUrl = `/users/${username}`; const userUrl = `/users/${username}/`;
return ( return (
<div className="studio-member-tile"> <div className="studio-member-tile">
<a href={userUrl}> <a href={userUrl}>

View file

@ -18,7 +18,7 @@ const StudioProjectTile = ({
}) => { }) => {
const [submitting, setSubmitting] = useState(false); const [submitting, setSubmitting] = useState(false);
const projectUrl = `/projects/${id}`; const projectUrl = `/projects/${id}`;
const userUrl = `/users/${username}`; const userUrl = `/users/${username}/`;
const {errorAlert} = useContext(AlertContext); const {errorAlert} = useContext(AlertContext);
return ( return (
<div className="studio-project-tile"> <div className="studio-project-tile">