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

Francis Daly francis at
Fri Aug 30 23:21:40 UTC 2019

On Fri, Aug 30, 2019 at 04:59:36PM -0500, J. Lewis Muir wrote:

Hi there,

> I was wishing for a way to specify a new root but with a modified
> request URI.  So, I tried the alias directive, and I assumed that
> $document_root and $realpath_root would refer to the aliased document
> root, but obviously that can't be since nginx has no way of knowing what
> the aliased document root should be when all it has is a location alias
> which is the full path to the resource.  Sorry for the trouble.

It sounds like your desires are for requests:

 * starts with /my-app/current/ -> reject
 * starts with /my-app/releases/ -> reject
 * matches /my-app/something.php, or /myapp/something.php/anything ->
fastcgi-process the file /srv/www/my-app/current/something.php
 * matches /my-app/something -> just send the file

Is that correct? If so -- do exactly that.

For example (but mostly untested):

  location ^~ /my-app/current/ { return 200 "nothing to see at /current/\n"; }
  location ^~ /my-app/releases/ { return 200 "nothing to see at /releases/\n"; }
  location ^~ /my-app/ {
    location ~ \.php($|/) {
      fastcgi_split_path_info ^/my-app(/.*php)(.*);
      root /srv/www/my-app/current/;
      include fastcgi.conf;
      fastcgi_pass unix:php.sock;
    alias /srv/www/my-app/current/;

Change the "return"s to 404s or whatever; change the "fastcgi_pass"
destination; and don't worry about internal rewrites unless you need them.

fastcgi.conf presumably sets SCRIPT_FILENAME and PATH_INFO and whatever
else is interesting to sensible values; if not, add suitable fastcgi_param
values explicitly here.

You might want an "index index.php" somewhere to handle the request
for /my-app/.

But hopefully, any parts that don't Just Work as-is will leave enough
clues to allow you to find or ask for the solution.

Good luck with it,

Francis Daly        francis at

More information about the nginx mailing list