Skip to content

Commit

Permalink
fix(KUI-1369): noIndexMiddleware and noIndexMiddleware.test has been …
Browse files Browse the repository at this point in the history
…added to make sure that URL with aap*. is not indexed by google
  • Loading branch information
amirhossein-haerian committed Jun 20, 2024
1 parent ea131ef commit 614440d
Show file tree
Hide file tree
Showing 5 changed files with 209 additions and 3 deletions.
127 changes: 124 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
"jest-environment-jsdom": "29.7.0",
"lint-staged": "^15.2.5",
"mini-css-extract-plugin": "^2.9.0",
"node-mocks-http": "^1.14.1",
"nodemon": "^3.1.3",
"null-loader": "^4.0.1",
"path": "^0.12.7",
Expand Down
6 changes: 6 additions & 0 deletions server/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@ server.use(
})
)

/* ********************************
* ******* No index middleware ****
* ********************************
*/
server.use(require('./utils/noIndexMiddleware.js'))

/* **********************************
* ******* APPLICATION ROUTES *******
* **********************************
Expand Down
28 changes: 28 additions & 0 deletions server/utils/noIndexMiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const { server: serverConfig } = require('../configuration')

/**
* Middleware that adds "noindex" robots header if "server host" and the request
* host ("forwarded host") doesn't match. This is done to prevent Google from
* indexing app.kth.se/* when we want the user to use www.kth.se/*
*
* The "server host" (SERVER_HOST_URL) is the primary host we expected the
* app to be hosted on (ie https://www.kth.se).
*
* The orginal host of the request is replaced with an Azure host
* (*.azurewebsites.net) before reaching our app so we look at the "forwarded
* host" ("x-forwarded-host" header) .
*
* Default, if x-forwarded-host is missing, is to do nothing.
*/
const noIndexMiddleware = function (req, res, next) {
const forwardedHost = req.header('x-forwarded-host')
if (forwardedHost) {
const serverHostUrl = new URL(serverConfig.hostUrl)
const serverHost = serverHostUrl.host
if (serverHost !== forwardedHost) {
res.set('x-robots-tag', 'noindex')
}
}
next()
}
module.exports = noIndexMiddleware
50 changes: 50 additions & 0 deletions server/utils/noIndexMiddleware.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
const httpMocks = require('node-mocks-http')

const noIndexMiddleware = require('./noIndexMiddleware')

const mockedServerHost = 'mockedserverhost.example.com'
jest.mock('../configuration', () => ({
server: { hostUrl: 'https://mockedserverhost.example.com' },
}))

describe('noIndexMiddleware', () => {
it('should not set "X-Robots-Tag" header if "X-Forwarded-Host" is missing', () => {
const next = jest.fn()
const { req, res } = httpMocks.createMocks({
headers: {},
})

noIndexMiddleware(req, res, next)

expect(res.getHeader('X-Robots-Tag')).toBeUndefined()
expect(next).toHaveBeenCalledTimes(1)
})

it('should not set "X-Robots-Tag" header if "X-Forwarded-Host" match SERVER_HOST_URL', () => {
const next = jest.fn()
const { req, res } = httpMocks.createMocks({
headers: {
'X-Forwarded-Host': mockedServerHost,
},
})

noIndexMiddleware(req, res, next)

expect(res.getHeader('X-Robots-Tag')).toBeUndefined()
expect(next).toHaveBeenCalledTimes(1)
})

it('should set "X-Robots-Tag" header if "X-Forwarded-Host" does not match SERVER_HOST_URL', () => {
const next = jest.fn()
const { req, res } = httpMocks.createMocks({
headers: {
'X-Forwarded-Host': 'anotherhost.example.com',
},
})

noIndexMiddleware(req, res, next)

expect(res.getHeader('X-Robots-Tag')).toBe('noindex')
expect(next).toHaveBeenCalledTimes(1)
})
})

0 comments on commit 614440d

Please sign in to comment.