Recently I moved the Citation.js API documentation from /api
to /api/0.3
, to put the new documentation on /api/0.5
. I fixed all the links to the documentation, but I still got a issue request regarding a 404 error after just a few days. All in all, I had to redirect pages from /api/*
to /api/0.3/*
while all these pages are hosted as static files on GitHub Pages.
There are three ways I found to do this:
- I make otherwise empty HTML files in
/api/*
that redirect to/api/0.3/*
via JavaScript or a<meta>
tag. - I make use of
jekyll-redirect-from
. This is equivalent to option 1, I think.
Option 1 seemed like a hassle and I do not use Jekyll so option 2 seemed out of the question as well. However, we still have option 3 to consider:
- I add a
404.html
to the repository which gets served automatically on a 404. It then redirects to/api/0.3/*
with JavaScript, and gives guidance on how to find the new URL manually if JavaScript is disabled.
404.html
is just a normal 404 page with 4 lines of JavaScript:
var docsPattern = /(\/api)(\/(?!0.[35]\/)|$)/
if (docsPattern.test(location.pathname)) {
location.pathname = location.pathname.replace(docsPattern, '$1/0.3$2')
}
Breaking down the RegExp pattern:
(\/api)
matches “/api” in the URL(\/(?!0.[35]\/)|$)
matches one of two things, immediately after “/api”- Either
$
, the end of the string (like “https://citation.js.org/api” without the trailing slash) - Or
\/(?!0.[35]\/)
, which matches a forward slash ("/api/") followed by anything except “0.3” or “0.5”. This is to avoid matching things like “/apical/” or “/api/0.3/does-not-exist”.
- Either
This is not the neatest solution but I like it conceptually. It shows a bit of potential for Single-Page Applications as well: you can serve the same HTML+JavaScript for every possible path without having to rely on URLs like https://example.org/#/path/page
. The problem is that you still get the 404 HTTP status (as you should), so if a browser or search crawler decides to care you have a problem.
Try it out now: https://citation.js.org/api/
No comments:
Post a Comment