mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
Always use our redirects utility (#9132)
no issue - This started as an attempt to simplify the admin redirect code - I realised we were sometimes using utils.redirect301 and sometimes not - Decided to move this into utils.url as it's more relevant to URL generation - Unified usage of redirects in the codebase - Updated tests & ensured we have basic coverage - rename adminRedirect -> redirectToAdmin - Tweak method signature, fix channel edit redirects - Tests: Optimised test descriptions for url-redirects_spec.js - ensure caching works as expected
This commit is contained in:
parent
9699016cca
commit
9f9d8b2fec
17 changed files with 384 additions and 316 deletions
|
@ -10,17 +10,10 @@ module.exports = function frontendRoutes() {
|
|||
routeKeywords = config.get('routeKeywords');
|
||||
|
||||
// ### Admin routes
|
||||
router.get(/^\/(logout|signout)\/$/, function redirectToSignout(req, res) {
|
||||
utils.redirect301(res, utils.url.urlJoin(utils.url.urlFor('admin'), '#/signout/'));
|
||||
});
|
||||
router.get(/^\/signup\/$/, function redirectToSignup(req, res) {
|
||||
utils.redirect301(res, utils.url.urlJoin(utils.url.urlFor('admin'), '#/signup/'));
|
||||
});
|
||||
|
||||
router.get(/^\/(logout|signout)\/$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '#/signout/'); });
|
||||
router.get(/^\/signup\/$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '#/signup/'); });
|
||||
// redirect to /ghost and let that do the authentication to prevent redirects to /ghost//admin etc.
|
||||
router.get(/^\/((ghost-admin|admin|wp-admin|dashboard|signin|login)\/?)$/, function redirectToAdmin(req, res) {
|
||||
utils.redirect301(res, utils.url.urlFor('admin'));
|
||||
});
|
||||
router.get(/^\/((ghost-admin|admin|wp-admin|dashboard|signin|login)\/?)$/, function (req, res) { return utils.url.redirectToAdmin(301, res, '/'); });
|
||||
|
||||
// Post Live Preview
|
||||
router.get(utils.url.urlJoin('/', routeKeywords.preview, ':uuid', ':options?'), controllers.preview);
|
||||
|
|
|
@ -24,7 +24,7 @@ channelConfig = function channelConfig() {
|
|||
}
|
||||
},
|
||||
slugTemplate: true,
|
||||
editRedirect: utils.url.urlJoin(utils.url.urlFor('admin'), '#/settings/tags/:slug/')
|
||||
editRedirect: '#/settings/tags/:slug/'
|
||||
},
|
||||
author: {
|
||||
name: 'author',
|
||||
|
@ -40,7 +40,7 @@ channelConfig = function channelConfig() {
|
|||
}
|
||||
},
|
||||
slugTemplate: true,
|
||||
editRedirect: utils.url.urlJoin(utils.url.urlFor('admin'), '#/team/:slug/')
|
||||
editRedirect: '#/team/:slug/'
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -19,9 +19,9 @@ function handlePageParam(req, res, next, page) {
|
|||
if (page === 1) {
|
||||
// Page 1 is an alias, do a permanent 301 redirect
|
||||
if (rssRegex.test(req.url)) {
|
||||
return utils.redirect301(res, req.originalUrl.replace(rssRegex, '/rss/'));
|
||||
return utils.url.redirect301(res, req.originalUrl.replace(rssRegex, '/rss/'));
|
||||
} else {
|
||||
return utils.redirect301(res, req.originalUrl.replace(pageRegex, '/'));
|
||||
return utils.url.redirect301(res, req.originalUrl.replace(pageRegex, '/'));
|
||||
}
|
||||
} else if (page < 1 || isNaN(page)) {
|
||||
// Nothing less than 1 is a valid page number, go straight to a 404
|
||||
|
@ -47,7 +47,7 @@ rssRouter = function rssRouter(channelConfig) {
|
|||
router.get(baseRoute, stack);
|
||||
router.get(utils.url.urlJoin(baseRoute, ':page(\\d+)/'), stack);
|
||||
router.get('/feed/', function redirectToRSS(req, res) {
|
||||
return utils.redirect301(res, utils.url.urlJoin(utils.url.getSubdir(), req.baseUrl, baseRoute));
|
||||
return utils.url.redirect301(res, utils.url.urlJoin(utils.url.getSubdir(), req.baseUrl, baseRoute));
|
||||
});
|
||||
|
||||
router.param('page', handlePageParam);
|
||||
|
@ -86,7 +86,7 @@ channelRouter = function router() {
|
|||
|
||||
if (channel.editRedirect) {
|
||||
channelRouter.get('/edit/', function redirect(req, res) {
|
||||
res.redirect(utils.url.urlJoin(utils.url.getSubdir(), channel.editRedirect.replace(':slug', req.params.slug)));
|
||||
utils.url.redirectToAdmin(302, res, channel.editRedirect.replace(':slug', req.params.slug));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -21,14 +21,14 @@ module.exports = function preview(req, res, next) {
|
|||
|
||||
if (req.params.options && req.params.options.toLowerCase() === 'edit') {
|
||||
// CASE: last param is of url is /edit, redirect to admin
|
||||
return res.redirect(utils.url.urlJoin(utils.url.urlFor('admin'), 'editor', post.id, '/'));
|
||||
return utils.url.redirectToAdmin(302, res, '#/editor/' + post.id);
|
||||
} else if (req.params.options) {
|
||||
// CASE: unknown options param detected. Ignore and end in 404.
|
||||
return next();
|
||||
}
|
||||
|
||||
if (post.status === 'published') {
|
||||
return res.redirect(301, utils.url.urlFor('post', {post: post}));
|
||||
return utils.url.redirect301(res, utils.url.urlFor('post', {post: post}));
|
||||
}
|
||||
|
||||
setRequestIsSecure(req, post);
|
||||
|
|
|
@ -21,12 +21,12 @@ module.exports = function single(req, res, next) {
|
|||
|
||||
// CASE: last param is of url is /edit, redirect to admin
|
||||
if (lookup.isEditURL) {
|
||||
return res.redirect(utils.url.urlJoin(utils.url.urlFor('admin'), 'editor', post.id, '/'));
|
||||
return utils.url.redirectToAdmin(302, res, '#/editor/' + post.id);
|
||||
}
|
||||
|
||||
// CASE: permalink is not valid anymore, we redirect him permanently to the correct one
|
||||
if (post.url !== req.path) {
|
||||
return res.redirect(301, post.url);
|
||||
return utils.url.redirect301(res, post.url);
|
||||
}
|
||||
|
||||
setRequestIsSecure(req, post);
|
||||
|
|
|
@ -7,12 +7,12 @@
|
|||
// @TODO optimise this to reduce the number of redirects required to get to a pretty URL
|
||||
// @TODO move this to being used by routers?
|
||||
var slashes = require('connect-slashes'),
|
||||
utils = require('../utils');
|
||||
config = require('../config');
|
||||
|
||||
module.exports = [
|
||||
slashes(true, {
|
||||
headers: {
|
||||
'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S
|
||||
'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')
|
||||
}
|
||||
}),
|
||||
require('./uncapitalise')
|
||||
|
|
|
@ -39,8 +39,7 @@ uncapitalise = function uncapitalise(req, res, next) {
|
|||
utils.removeOpenRedirectFromUrl((req.originalUrl || req.url).replace(pathToTest, pathToTest.toLowerCase()))
|
||||
);
|
||||
|
||||
res.set('Cache-Control', 'public, max-age=' + utils.ONE_YEAR_S);
|
||||
res.redirect(301, redirectPath);
|
||||
return utils.url.redirect301(res, redirectPath);
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@ urlRedirects = function urlRedirects(req, res, next) {
|
|||
|
||||
if (redirectUrl) {
|
||||
debug('url redirect to: ' + redirectUrl);
|
||||
return res.redirect(301, redirectUrl);
|
||||
return utils.url.redirect301(res, redirectUrl);
|
||||
}
|
||||
|
||||
debug('no url redirect');
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
var unidecode = require('unidecode'),
|
||||
_ = require('lodash'),
|
||||
config = require('../config'),
|
||||
errors = require('../errors'),
|
||||
i18n = require('../i18n'),
|
||||
utils,
|
||||
|
@ -109,12 +108,6 @@ utils = {
|
|||
return base64String;
|
||||
},
|
||||
|
||||
redirect301: function redirect301(res, path) {
|
||||
/*jslint unparam:true*/
|
||||
res.set({'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')});
|
||||
res.redirect(301, path);
|
||||
},
|
||||
|
||||
/**
|
||||
* NOTE: No separate utils file, because redirects won't live forever in a JSON file, see V2 of https://github.com/TryGhost/Ghost/issues/7707
|
||||
*/
|
||||
|
|
|
@ -349,12 +349,28 @@ function isSSL(urlToParse) {
|
|||
return protocol === 'https:';
|
||||
}
|
||||
|
||||
function redirect301(res, redirectUrl) {
|
||||
res.set({'Cache-Control': 'public, max-age=' + config.get('caching:301:maxAge')});
|
||||
return res.redirect(301, redirectUrl);
|
||||
}
|
||||
|
||||
function redirectToAdmin(status, res, adminPath) {
|
||||
var redirectUrl = urlJoin(urlFor('admin'), adminPath, '/');
|
||||
|
||||
if (status === 301) {
|
||||
return redirect301(res, redirectUrl);
|
||||
}
|
||||
return res.redirect(redirectUrl);
|
||||
}
|
||||
|
||||
module.exports.getProtectedSlugs = getProtectedSlugs;
|
||||
module.exports.getSubdir = getSubdir;
|
||||
module.exports.urlJoin = urlJoin;
|
||||
module.exports.urlFor = urlFor;
|
||||
module.exports.isSSL = isSSL;
|
||||
module.exports.urlPathForPost = urlPathForPost;
|
||||
module.exports.redirectToAdmin = redirectToAdmin;
|
||||
module.exports.redirect301 = redirect301;
|
||||
|
||||
/**
|
||||
* If you request **any** image in Ghost, it get's served via
|
||||
|
|
|
@ -94,7 +94,8 @@ describe('Public API', function () {
|
|||
|
||||
request.get(testUtils.API.getApiQuery('posts?client_id=ghost-test&client_secret=not_available'))
|
||||
.set('Origin', 'https://example.com')
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
// 301 Redirects _should_ be cached
|
||||
.expect('Cache-Control', testUtils.cacheRules.year)
|
||||
.expect(301)
|
||||
.end(function (err, res) {
|
||||
if (err) {
|
||||
|
|
|
@ -263,7 +263,7 @@ describe('Frontend Routing', function () {
|
|||
|
||||
it('should redirect to editor', function (done) {
|
||||
request.get('/welcome/edit/')
|
||||
.expect('Location', /ghost\/editor\/\w+/)
|
||||
.expect('Location', /ghost\/#\/editor\/\w+/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.public)
|
||||
.expect(302)
|
||||
.end(doEnd(done));
|
||||
|
@ -412,7 +412,7 @@ describe('Frontend Routing', function () {
|
|||
|
||||
it('should redirect to editor', function (done) {
|
||||
request.get('/static-page-test/edit/')
|
||||
.expect('Location', /ghost\/editor\/\w+/)
|
||||
.expect('Location', /ghost\/#\/editor\/\w+/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.public)
|
||||
.expect(302)
|
||||
.end(doEnd(done));
|
||||
|
@ -473,7 +473,7 @@ describe('Frontend Routing', function () {
|
|||
request.get('/p/2ac6b4f6-e1f3-406c-9247-c94a0496d39d/')
|
||||
.expect(301)
|
||||
.expect('Location', '/short-and-sweet/')
|
||||
.expect('Cache-Control', testUtils.cacheRules.public)
|
||||
.expect('Cache-Control', testUtils.cacheRules.year)
|
||||
.end(doEnd(done));
|
||||
});
|
||||
|
||||
|
|
|
@ -115,7 +115,8 @@ describe('Controllers', function () {
|
|||
res = {
|
||||
locals: {},
|
||||
render: sinon.spy(),
|
||||
redirect: sinon.spy()
|
||||
redirect: sinon.spy(),
|
||||
set: sinon.spy()
|
||||
};
|
||||
});
|
||||
|
||||
|
@ -152,6 +153,7 @@ describe('Controllers', function () {
|
|||
should.not.exist(err);
|
||||
res.render.called.should.be.false();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
|
||||
done();
|
||||
});
|
||||
|
@ -161,6 +163,7 @@ describe('Controllers', function () {
|
|||
req.params = {uuid: 'abc-1234-03'};
|
||||
res.redirect = function (status, url) {
|
||||
res.render.called.should.be.false();
|
||||
res.set.called.should.be.true();
|
||||
status.should.eql(301);
|
||||
url.should.eql('/getting-started/');
|
||||
|
||||
|
@ -174,7 +177,8 @@ describe('Controllers', function () {
|
|||
req.params = {uuid: 'abc-1234-01', options: 'edit'};
|
||||
res.redirect = function (url) {
|
||||
res.render.called.should.be.false();
|
||||
url.should.eql('/ghost/editor/1/');
|
||||
res.set.called.should.be.false();
|
||||
url.should.eql('/ghost/#/editor/1/');
|
||||
|
||||
done();
|
||||
};
|
||||
|
@ -189,6 +193,7 @@ describe('Controllers', function () {
|
|||
should.not.exist(err);
|
||||
res.render.called.should.be.false();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
|
||||
done();
|
||||
});
|
||||
|
|
|
@ -17,7 +17,7 @@ var should = require('should'),
|
|||
sandbox = sinon.sandbox.create();
|
||||
|
||||
describe('Controllers', function () {
|
||||
var adminEditPagePath = '/ghost/editor/',
|
||||
var adminEditPagePath = '/ghost/#/editor/',
|
||||
localSettingsCache = {},
|
||||
hasTemplateStub;
|
||||
|
||||
|
|
|
@ -15,7 +15,8 @@ describe('UNIT: url redirects', function () {
|
|||
}
|
||||
};
|
||||
res = {
|
||||
redirect: sandbox.spy()
|
||||
redirect: sandbox.spy(),
|
||||
set: sandbox.spy()
|
||||
};
|
||||
|
||||
next = sandbox.spy();
|
||||
|
@ -27,300 +28,330 @@ describe('UNIT: url redirects', function () {
|
|||
host = null;
|
||||
});
|
||||
|
||||
it('blog is http, requester uses http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
describe('expect redirect', function () {
|
||||
it('blog is https, request is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com:2368/'
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.called.should.be.true();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
it('blog host is !== request host', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
next.calledWith().should.be.true();
|
||||
done();
|
||||
host = 'localhost:2368';
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.called.should.be.true();
|
||||
res.redirect.calledWith(301, 'https://localhost:2368/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('url and admin url are equal, but protocol is different, request is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('url and admin url are different, request is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('subdirectory', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/blog',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/blog/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/blog/ghost/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
|
||||
req.secure = true;
|
||||
host = 'admin.default.com:2368';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.calledOnce.should.be.true();
|
||||
res.set.calledOnce.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('keeps query', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
req.query = {
|
||||
test: true
|
||||
};
|
||||
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/?test=true').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('original url has search params', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost/something?a=b';
|
||||
req.query = {
|
||||
a: 'b'
|
||||
};
|
||||
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/something/?a=b').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('ensure redirect loop won\'t happen', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
|
||||
res.set.called.should.be.true();
|
||||
|
||||
res.redirect.reset();
|
||||
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.calledOnce.should.be.true();
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('blog is https, requester uses https', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com:2368/'
|
||||
describe('expect no redirect', function () {
|
||||
it('blog is http, request is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
next.calledWith().should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
it('blog is http, request is https', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
next.calledWith().should.be.true();
|
||||
done();
|
||||
});
|
||||
host = 'default.com:2368';
|
||||
|
||||
it('[redirect] blog is https, requester uses http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com:2368/'
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
it('blog is http, request is https (trailing slash is missing)', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.called.should.be.true();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/').should.be.true();
|
||||
done();
|
||||
});
|
||||
host = 'default.com:2368/';
|
||||
|
||||
it('blog is http, requester uses https', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
it('blog is https, request is https', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com:2368/'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
host = 'default.com:2368';
|
||||
|
||||
it('blog is http, requester uses https', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/'
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
next.calledWith().should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368/';
|
||||
it('blog host is !== request host', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
host = 'localhost:2368';
|
||||
|
||||
it('blog host is !== request host', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com'
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'localhost:2368';
|
||||
it('admin is blog url and http, requester is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
it('[redirect] blog host is !== request host', function (done) {
|
||||
configUtils.set({
|
||||
url: 'https://default.com'
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'localhost:2368';
|
||||
it('admin request, no custom admin.url configured', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368'
|
||||
});
|
||||
|
||||
req.originalUrl = '/';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.called.should.be.true();
|
||||
res.redirect.calledWith(301, 'https://localhost:2368/').should.be.true();
|
||||
done();
|
||||
});
|
||||
host = 'localhost:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
it('admin is blog url and http, requester is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368'
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
it('url and admin url are different, protocol is different, request is not secure', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://blog.ghost.org',
|
||||
admin: {
|
||||
url: 'http://something.com'
|
||||
}
|
||||
});
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
host = 'something.com';
|
||||
res.isAdmin = true;
|
||||
req.secure = false;
|
||||
|
||||
it('admin request, no custom admin.url configured', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368'
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'localhost:2368';
|
||||
res.isAdmin = true;
|
||||
it('url and admin url are different, protocol is different, request is secure', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://blog.ghost.org',
|
||||
admin: {
|
||||
url: 'http://something.com'
|
||||
}
|
||||
});
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
res.redirect.called.should.be.false();
|
||||
done();
|
||||
});
|
||||
host = 'something.com';
|
||||
res.isAdmin = true;
|
||||
req.secure = true;
|
||||
|
||||
it('[redirect] admin is custom url and https, requester is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://default.com:2368'
|
||||
}
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
|
||||
res.redirect.called.should.be.false();
|
||||
res.set.called.should.be.false();
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[redirect] admin is custom url and https, requester is http', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/').should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[redirect] subdirectory', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368/blog',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/blog/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/blog/ghost/').should.be.true();
|
||||
|
||||
req.secure = true;
|
||||
host = 'admin.default.com:2368';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[redirect] keeps query', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
req.query = {
|
||||
test: true
|
||||
};
|
||||
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/?test=true').should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[redirect] original url has search params', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://admin.default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost/something?a=b';
|
||||
req.query = {
|
||||
a: 'b'
|
||||
};
|
||||
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://admin.default.com:2368/ghost/something/?a=b').should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[redirect] same url and admin url, but different protocol.', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://default.com:2368',
|
||||
admin: {
|
||||
url: 'https://default.com:2368'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'default.com:2368';
|
||||
res.isAdmin = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.false();
|
||||
res.redirect.calledWith(301, 'https://default.com:2368/ghost/').should.be.true();
|
||||
|
||||
req.secure = true;
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[no redirect] different url and admin url, but different protocol.', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://blog.ghost.org',
|
||||
admin: {
|
||||
url: 'http://something.com'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'something.com';
|
||||
res.isAdmin = true;
|
||||
req.secure = false;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
|
||||
it('[no redirect] different url and admin url, but different protocol.', function (done) {
|
||||
configUtils.set({
|
||||
url: 'http://blog.ghost.org',
|
||||
admin: {
|
||||
url: 'http://something.com'
|
||||
}
|
||||
});
|
||||
|
||||
host = 'something.com';
|
||||
res.isAdmin = true;
|
||||
req.secure = true;
|
||||
|
||||
req.originalUrl = '/ghost';
|
||||
urlRedirects(req, res, next);
|
||||
next.called.should.be.true();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
var should = require('should'), // jshint ignore:line
|
||||
sinon = require('sinon'),
|
||||
nock = require('nock'),
|
||||
configUtils = require('../utils/configUtils'),
|
||||
gravatar = require('../../server/utils/gravatar'),
|
||||
|
@ -145,22 +144,4 @@ describe('Server Utilities', function () {
|
|||
}).catch(done);
|
||||
});
|
||||
});
|
||||
|
||||
describe('redirect301', function () {
|
||||
it('performs a 301 correctly', function (done) {
|
||||
var res = {};
|
||||
|
||||
res.set = sinon.spy();
|
||||
|
||||
res.redirect = function (code, path) {
|
||||
code.should.equal(301);
|
||||
path.should.eql('my/awesome/path');
|
||||
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
|
||||
|
||||
done();
|
||||
};
|
||||
|
||||
utils.redirect301(res, 'my/awesome/path');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -576,4 +576,53 @@ describe('Url', function () {
|
|||
utils.url.urlPathForPost(testData).should.equal(postLink);
|
||||
});
|
||||
});
|
||||
|
||||
describe('redirects', function () {
|
||||
it('performs 301 redirect correctly', function (done) {
|
||||
var res = {};
|
||||
|
||||
res.set = sinon.spy();
|
||||
|
||||
res.redirect = function (code, path) {
|
||||
code.should.equal(301);
|
||||
path.should.eql('my/awesome/path');
|
||||
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
|
||||
|
||||
done();
|
||||
};
|
||||
|
||||
utils.url.redirect301(res, 'my/awesome/path');
|
||||
});
|
||||
|
||||
it('performs an admin 301 redirect correctly', function (done) {
|
||||
var res = {};
|
||||
|
||||
res.set = sinon.spy();
|
||||
|
||||
res.redirect = function (code, path) {
|
||||
code.should.equal(301);
|
||||
path.should.eql('/ghost/#/my/awesome/path/');
|
||||
res.set.calledWith({'Cache-Control': 'public, max-age=' + utils.ONE_YEAR_S}).should.be.true();
|
||||
|
||||
done();
|
||||
};
|
||||
|
||||
utils.url.redirectToAdmin(301, res, '#/my/awesome/path');
|
||||
});
|
||||
|
||||
it('performs an admin 302 redirect correctly', function (done) {
|
||||
var res = {};
|
||||
|
||||
res.set = sinon.spy();
|
||||
|
||||
res.redirect = function (path) {
|
||||
path.should.eql('/ghost/#/my/awesome/path/');
|
||||
res.set.called.should.be.false();
|
||||
|
||||
done();
|
||||
};
|
||||
|
||||
utils.url.redirectToAdmin(302, res, '#/my/awesome/path');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue