Allow internal redirect to URI x, but deny external request for x?

J. Lewis Muir jlmuir at imca-cat.org
Sat Aug 31 15:31:00 UTC 2019


On 08/30, Ian Hobson wrote:
> Hi Lewis,
> 
> On 30/08/19 18:33, J. Lewis Muir wrote:
> > Hello!
> > 
> > I'm using nginx 1.12.2 on RHEL 7, and I've got a FastCGI web app that
> > uses a deployment structure which uses an atomic symlink change for an
> > atomic app deploy, and I'm wishing to be able to do an internal redirect
> > in nginx to URL x, but deny an external request to the same URL x so
> > that I don't serve the same content at more than one URL.  Is there a
> > way to do that?
> > 
> You could place the different versions away from the root so they cannot be
> obtained from the web. Then they can be served by setting up a symlink to
> the desired version.
> 
> This can be changed using "ln -sfn version/dir serving/root" and then
> restarting nginx to pick up the new version.
> 
> By not using redirects, this method should be more efficient.
> 
> Regards
> 
> Ian

Hi, Ian!

Thank you for the suggestion!  That's an interesting idea, and that
would avoid needing to exclude those URIs from being served and I think
avoid needing to change the document root and maybe some other things.

I toyed around with some designs and came up with four; I think I like
the third one best, but I'm not sure, maybe the fourth one is better.

= Design #1

Web app root:

  /srv/www/app/my-app
    current -> releases/1.0.2
    releases
      1.0.0
      1.0.1
      1.0.2

nginx server document root:

  /srv/www/host/localhost
    my-app -> /srv/www/app/my-app/current

Comments:

  This tries to share apps between virtual hosts.  It provides no way
  for different virtual hosts to serve the same app but with the app
  configured differently.  Also, all virtual hosts have to serve the
  same version of the app.

= Design #2

Web app root:

  /srv/www/app/my-app
    1.0.0
    1.0.1
    1.0.2

nginx server document root:

  /srv/www/host/localhost
    my-app -> /srv/www/app/my-app/1.0.2

Comments:

  Similar to design #1 except now the virtual hosts can server different
  versions of the app, but for a given version, the app is still
  configured in the exact same way for all virtual hosts.

= Design #3

Web app root:

  /srv/www/localhost/app
    my-app
      1.0.0
      1.0.1
      1.0.2

nginx server document root:

  /srv/www/localhost/root
    my-app -> ../app/my-app/1.0.2

Comments:

  I like this because now each virtual host has its own set of deployed
  apps, so the apps can be configured specifically for that particular
  virtual host.

= Design #4

Web app root:

  /srv/www/localhost/app
    my-app
      current -> releases/1.0.2
      releases
        1.0.0
        1.0.1
        1.0.2

nginx server document root:

  /srv/www/localhost/root
    my-app -> ../app/my-app/current

Comments:

  Similar to design #3 but moves where the "current" symlink lives.  So,
  the deployed version of the app is controlled under the web app root
  rather under the nginx server document root.  Maybe this is a little
  better because the nginx config reference to "my-app" can be sure to
  be correct and can be changed if desired, and be unrelated to which
  version of the app is deployed via the "current" symlink in the web
  app root.  The downside is two symlinks (i.e., a symlink to a symlink)
  as opposed to one.

Regards,

Lewis


More information about the nginx mailing list