How to redirect URLs using Laravel Forge Nginx

Recently, I needed to add 301 redirects to some URLs from an old app to the new one. So for example, login.php from an old PHP app to the new app built with Laravel.

To do this it is pretty simple. First, if you are using Laravel Forge, you can go to your application site in Forge, i.e. myapp.com, then at the bottom of the page you will see some links, one being "Files". When you click "Files" it will pop up with "Edit Nginx Configuration".

In the Nginx Configuration file you will see the following code:

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/myapp.com/before/*;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name myapp.com;
    root /home/forge/myapp.com/public;

    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/myapp.com/466437/server.crt;
    ssl_certificate_key /etc/nginx/ssl/myapp.com/466437/server.key;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DO NOT REMOVE!)
    include forge-conf/myapp.com/server/*;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/myapp.com-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

}

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/myapp.com/after/*;

In here you will need to add :

 # SEO REDIRECTS (from .php to non-.php)
    rewrite ^/registration.php /registration permanent;
    rewrite ^/login.php /login permanent;

So your final file will look like

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/myapp.com/before/*;

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name myapp.com;
    root /home/forge/myapp.com/public;

    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/myapp.com/466437/server.crt;
    ssl_certificate_key /etc/nginx/ssl/myapp.com/466437/server.key;

    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DO NOT REMOVE!)
    include forge-conf/myapp.com/server/*;

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

   # SEO REDIRECTS (from .php to non-.php)
    rewrite ^/registration.php /registration permanent;
    rewrite ^/login.php /login permanent;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/myapp.com-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

}

# FORGE CONFIG (DO NOT REMOVE!)
include forge-conf/myapp.com/after/*;

This also works if you do not use Forge to manage your site. You will need to locate your Nginx config file and then modify from there. Normally by SSH into the server.

Hope this has helped in some way.