0

I have an existing Laravel API application running on Beanstalk. It's been lagging in updates on EBS, so currently I'm in the process of upgrading the platforms and CI/CD for this app. There one remaining problem I'm running into, which leaves me scratching my head at the 'but it should work'-level.

What I want

All URLs containing https://example.com/index.php/endpoint to be redirected to https://example.com/endpoint and show the same content as https://example.com/index.php/endpoint would (incl. subsequent the URL's slugs)

How I'm trying to do this

Due to this wonderful answer by cnst, I have the configuration below that seems to work for many (incl. some other online sources).

server{
    index index.php;

    if ($request_uri ~* "^(.*/)index\.php/*(.*)$") {
        return 301 $1$2;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        # Remove from everywhere index.php
        if ($request_uri ~* "^(.*/)index\.php(/?)(.*)") {
            return 301 $1$3;
        }
    }

    if (!-d $request_filename) {
        rewrite ^/(.+)/$ /$1 permanent;
    }

    if ($request_uri ~* "\/\/") {
        rewrite ^/(.*) /$1 permanent;
    }
}

I'm putting this configuration in a file located at my_project/.platform/nginx/conf.d/proxy.conf, which according to AWS' documentation, should upload with the project and extend the nginx configuration. As far as I can tell, it does pick it up, since any typo will result in an error after eb deploy. I can also see on the server it has been added to /etc/nginx/conf.d/proxy.conf.

The Problem

Even though the extending proxy.conf is being deployed and the configuration in it seems to be picked up, the application won't pick up the rewrite and leave the application URLs running with the index.php instead of the rewrite.

  • https://example.com/index.php/endpoint → works
  • https://example.com/endpoint → results in a server generated 404
  • Nginx logs show 2021/02/12 14:23:24 [error] 7523#0: *35 open() "/var/www/html/public/api" failed (2: No such file or directory) which tells me it has searched for a file and never tried running it through index.php.

The Questions

  • What am I missing in my configuration?
  • Or is it something about EBS that I overlooked or misunderstood?
  • Is the index.php angry since I'm trying to hide its face from public view?
TylerH
  • 20,799
  • 66
  • 75
  • 101
artjulian
  • 183
  • 1
  • 7

1 Answers1

1

Solution moved from the question to an answer:

I gave it a weekend to see if anyone would know and went back to work.

First thing, I did is see if Beanstalk was picking up any configuration, so I put an invalid variable in and see if that would break the server. It didn't...

Second, I checked if my Beanstalk instance was actually using Nginx (default) or got switch to Apache (httpd) for some reason (it includes both). Via its GUI config I could easily tell it's Nginx.

Third, I viewed the nginx.conf on the server and checked how other .conf files were being included. Part of it is seen here;

http {
    [...]
    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade {
        [...]
    }

    server {
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        [...]

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
   }
}

Here lays the problem; I was including a file at the conf.d/*.conf level with a second nginx server configuration block, which is effectively overwritten with the standard server configuration block by Beanstalks own config.

So there's two solutions here;

  1. override the entire nginx.conf by including a new .platform/nginx/nginx.conf in your project, where you extend the server block with your own config
  2. or, in my opinion more gracefully, add .platform/nginx/elasticbeanstalk/proxy.conf to your project, extending the server block specifically (but remove any server blocks from your own config)

Solution 2 will gard that AWS can always update its default nginx.conf without you having to watch out for it (unless they change the location of the elasticbeanstalk configs).

I did try putting my configuration in .platform/nginx/elasticbeanstalk/proxy.conf before, but that would break the server, since I was including a server block, causing it to double nest.

Lesson here;

  • add .platform/nginx/nginx.conf to override your entire Beanstalk Nginx configuration
  • add .platform/nginx/conf.d/your_conf.conf for any extensions to the http block
  • add .platform/nginx/conf.d/elasticbeanstalk/your_conf.conf for any extensions to the server block (or nesting within)
TylerH
  • 20,799
  • 66
  • 75
  • 101