Last active
October 9, 2024 01:24
-
-
Save tsolar/8d45ed05bcff8eb75404 to your computer and use it in GitHub Desktop.
Laravel in subdirectory nginx example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
client_body_in_file_only clean; | |
client_body_buffer_size 32K; | |
client_max_body_size 300M; | |
sendfile on; | |
send_timeout 300s; | |
# Port that the web server will listen on. | |
#listen 80; | |
# Host that will serve this project. | |
server_name tsolar.com; | |
# Useful logs for debug. | |
access_log /var/log/nginx/tsolar.com-access.log; | |
error_log /var/log/nginx/tsolar.com-error.log; | |
rewrite_log on; | |
# The location of our projects public directory. | |
root /home/tom/public_html/demos/; | |
# Point index to the Laravel front controller. | |
index index.php; | |
location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ { | |
access_log off; | |
expires max; | |
} | |
location / { | |
# URLs to attempt, including pretty ones. | |
try_files $uri $uri/ /index.php?q=$uri&$args; | |
} | |
# Remove trailing slash to please routing system. | |
if (!-d $request_filename) { | |
rewrite ^/(.+)/$ /$1 permanent; | |
} | |
# version 1 | |
location ^~ /demo1 { | |
alias /home/tom/public_html/demos/demo1/public; | |
try_files $uri $uri/ @demo1; | |
location ~* \.php { | |
fastcgi_pass unix:/var/run/php5-fpm.sock; | |
fastcgi_split_path_info ^(.+\.php)(.*)$; | |
include /etc/nginx/fastcgi_params; | |
} | |
} | |
location @demo1 { | |
rewrite ^/demo1/(.*)$ /demo1/index.php/$1 last; # THIS IS THE IMPORTANT LINE | |
} | |
# end version 1 | |
# version 2 | |
# this is with `ln -s /home/tom/public_html/demos/demo1/public <document root>/demo1` | |
location ~ /demo1 { | |
try_files /demo1/$uri /demo1/$uri/ /demo1/index.php?q=$uri&$args; | |
} | |
# end version 2 | |
# PHP FPM configuration. | |
location ~* \.php$ { | |
fastcgi_pass unix:/var/run/php5-fpm.sock; | |
include /etc/nginx/fastcgi_params; | |
fastcgi_index index.php; | |
fastcgi_split_path_info ^(.+\.php)(/.+)$; | |
fastcgi_param PATH_INFO $fastcgi_path_info; | |
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; | |
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |
} | |
# We don't need .ht files with nginx. | |
location ~ /\.ht { | |
deny all; | |
} | |
# Set header expirations on per-project basis | |
location ~* \.(?:ico|css|js|jpe?g|JPG|png|svg|woff)$ { | |
expires 365d; | |
} | |
} |
I have done that by using below configuration and its working. The above mentioned gist was displaying 404 "Not Found".
# sub_directory location ^~ /sub_directory { alias /var/www/choppies/sub_directory/public; try_files $uri $uri/ @sub_directory; location ~ \.php { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_param SCRIPT_FILENAME /var/www/choppies/sub_directory/public/index.php; } } location @sub_directory { rewrite /sub_directory/(.*)$ /sub_directory/index.php?/$1 last; } # end sub_directory
worked for me, thanks @SuryaElite
As of Aug'24, this worked for me:
server {
listen 443;
server_name www.example.com example.com;
charset utf-8;
root /var/www/www.example.com;
access_log /var/log/nginx/ssl-access.log;
error_log /var/log/nginx/ssl-error.log;
rewrite_log on;
# development settings
client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
ssl on;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include snippets/ssl-params.conf;
location ~ /.well-known {
allow all;
}
location ^~ /laravel {
alias /application/laravel/public;
access_log /var/log/nginx/laravel-access.log;
error_log /var/log/nginx/laravel-error.log error;
try_files $uri $uri/ @laravel;
location ~ \.php$ {
fastcgi_split_path_info ^\/laravel\/((?U).+\.php)(.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param HTTP_PROXY "";
fastcgi_param SCRIPT_FILENAME /app/public/$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /laravel/$fastcgi_script_name;
}
}
location @laravel {
rewrite /laravel/(.*)$ /laravel/index.php last; # Remove ?/$1 since fastcgi_params adds query string
}
... other stuff for my website ...
}
I had to adapt the examples posted by other users because the FPM daemon is running within a docker container, but nginx is not
And nginx does need access to the files to serve them, hence:
- The need to use an alias where the app files are present.
- The need to set the container path (/app) on the
SCRIPT_FILENAME
fastcgi_param
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The following config worked for me. Here's a video of it in action: Run Laravel via subdirectories on a Nginx server