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

J. Lewis Muir jlmuir at imca-cat.org
Fri Aug 30 17:33:17 UTC 2019


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?

For example, given the external request URI

  /my-app/index.html

I want to do an internal redirect to

  /my-app/current/index.html

but deny an external request for that same URI

  /my-app/current/index.html

because I don't want to serve the app from two different URLs (e.g.,
/my-app/ and /my-app/current/).

The app structure on disk is like the Capistrano structure

  https://capistranorb.com/documentation/getting-started/structure/

That is, it's like

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

"current" is a symlink.

In my nginx config, I've changed $document_root to $realpath_root in the
appropriate FastCGI parameters, and have the following locations:

  location /my-app/ {
    rewrite ^/my-app/(?!current/)(.*)$ /my-app/current/$1 last;
    index index.php;
  }

  location /my-app/current/ {
    return 404;
  }

  location /my-app/releases/ {
    return 404;
  }

  location ~ ^/my-app/.*?[^/]\.php(?:/|$) {
    include php-fpm-realpath.conf;
  }

Given an external request for a URI that starts with

  /my-app/

this returns 404 after the internal redirect.  If I remove the two
locations that return 404, then it serves the app, but it also allows
external requests such as

  /my-app/current/

which I don't want to allow since that's a duplicate of

  /my-app/

I initially tried using the alias directive which I thought was a better
fit for what I wanted to do

  location /my-app/ {
    alias /srv/www/my-app/current/;
    index index.php;
  }

  location /my-app/current/ {
    return 404;
  }

  location /my-app/releases/ {
    return 404;
  }

  location ~ ^/my-app/(.*?[^/]\.php(?:/.*|$)) {
    alias /srv/www/my-app/current/$1;
    include php-fpm-realpath.conf;
  }

But that didn't seem to work with the nginx FastCGI implementation.

Thank you!

Lewis


More information about the nginx mailing list