Nginx laravel configuration - linux

I am currently developing a laravel application, on a nginx webserver, I have always accessed my projects by editing /etc/hosts and adding an entry for the name of the project then adding a server block with server name in default file in nginx, so if I have a project called "Missouri", I would call it like this :
http://missouri/
I would like now to change this is a bit, and to use my IP Address, or my localhost to be before the project name, like this :
http://localhost/missouri/
I have searched a lot, found a lot of different combinations, but none was efficient, this is the configuration block for the general server configuration :
server {
listen 80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ^~ /Missouri {
alias /var/www/html/Missouri/public;
try_files $uri $uri/ /Missouri/index.php?$query_string;
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
If I use the previous configuration and call localhost/Missouri I get a File not found. white page error, however if I use the following code and call Missouri/ it works :
server {
listen 80;
server_name missouri;
root /var/www/html/Missouri/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
I would appreciate any help, thank you.

I'm not a DevOps but I think that you can write regex in your nginx server block, so "localhost/foo" will be an alias for "localhost/foo/public". By doing that you don't need to add block for every website.
On the other hand, about your question, I'd recommend you to use "root" instead of "alias". Here is an example code:
location /Missouri {
root /var/www/html/Missouri/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
I hope it works.

Related

Lubuntu Nginx - Phpmyadmin stuck on login

I migrated from apache2 to Nginx on my Lubuntu server.
I configured the phpmyadmin site as follow, and I can successfully navigate to it from localhost:88.
command: sudo nano etc/nginx/sites-available/phpmyadmin
server {
server_name _;
listen 88;
listen [::]:88;
listen 443 ssl http2;
listen [::]:443 ssl http2;
allow all;
# access_log logs/host.access.log;
# error_log logs/host.error.log;
root /usr/share/phpmyadmin;
index index.php;
location / {
# root /usr/share;
# index index.php;
try_files $uri $uri/ =404;
}
location ~ \.php$ {
# try_files $uri $document_root$fastcgi_script_name =404;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
fastcgi_param HTTP_PROXY "";
fastcgi_param HTTPS on;
fastcgi_request_buffering off;
}
}
Even when it works going on localhost:88 and I try to log into my console, I just get the page refreshed without any error or page change.
What am I missing?
I don't know why, but removing HTTPS part made it work. Now my config file looks like this:
server {
server_name _;
listen 88;
listen [::]:88;
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
allow all;
# access_log logs/host.access.log;
# error_log logs/host.error.log;
root /usr/share/phpmyadmin;
index index.php;
location / {
# root /usr/share;
# index index.php;
try_files $uri $uri/ =404;
}
location ~ \.php$ {
# try_files $uri $document_root$fastcgi_script_name =404;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
# fastcgi_param HTTP_PROXY "";
# fastcgi_param HTTPS on;
# fastcgi_request_buffering off;
}
}
If anyone knows why it works now, I'm curious

How can I configure Codeigniter in NGINX server? .htaccess not working

How can I configure Codeigniter in NGINX server? .htaccess is not working here and i have no root permission. Only I can upload files using FTP and can access database.
where can I use this config...?
server {
server_name domain.tld;
root /var/www/codeignitor;
index index.html index.php;
# set expiration of assets to MAX for caching
location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
expires max;
log_not_found off;
}
location / {
# Check if a file or directory index file exists, else route it to index.php.
try_files $uri $uri/ /index.php;
}
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}
}
Ref: https://www.nginx.com/resources/wiki/start/topics/recipes/codeigniter/
You should talk to your network admin for access of configuration files /etc/nginx/conf.d/default.conf. which needs to be configured correctly to make your routing work.you can configure your nginx server file like this code to make your routing work.
server{ listen 80; listen [::]:80; server_name 192.168.56.101 192.168.101.100 localhost; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/html; } location /ci { try_files $uri $uri/ /ci/index.php?/$request_uri; }location ~ \.php$ { try_files $uri $uri/ /ci/index.php?/$request_uri; fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }

NGINX - Why can I bypass password authentication?

I have a NGINX server and I use Apache-utility's for password requirement (.htpasswd). It MOSTLY works fine. The following this work fine:
example.com/admin
example.com/admin/
example.com/admin/index
but...
When I type example.com/admin/index.php and don't type any password at all and press "abort" the server show's the index.php (without any CSS or JS files). I think my PHP-FPM is the problem. Please take a look:
location / {
try_files $uri $uri.html $uri/ #extensionless-php;
index index.html index.htm index.php;
}
location #extensionless-php {
rewrite ^(.*)$ $1.php last;
}
location /admin {
auth_basic "Restricted";
auth_basic_user_file /admin/.htpasswd;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$
}
Just looking at the last two locations in your question:
location ^~ /admin {
auth_basic "Restricted";
auth_basic_user_file /admin/.htpasswd;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Adding the ^~ modifier makes the location ^~ /admin block take precedence over the other regex blocks (specifically the existing location ~ \.php$ block). So the authentication rules are uniformly applied to any URI beginning with /admin. See this document for details.
To avoid breaking PHP, the location ~ \.php$ block is duplicated within the location ^~ /admin block to process URIs that begin with /admin and end with .php.

Set up Ubuntu/Nginx

We have set up a local server on one of our branches. Ubuntu for OS and Nginx for Web server. Our target is to access our projects or websites by using this format http://Ip_address/Folder_Name. Like http://192.168.1.1/myproject1 and http://192.168.1.1/myproject2.
We have accomplished that target with the configuration below.
server {
listen 80;
listen [::]:80;
root /usr/share/nginx/html;
index index.php index.html index.htm;
server_name _;
location /myproject1 {
try_files $uri $uri/ /myproject1/public/index.php?q=$uri&$args;
}
location /myproject2 {
try_files $uri $uri/ /myproject2/public/index.php?q=$uri&$args;
}
location /myproject3 {
try_files $uri $uri/ /myproject3/public/index.php?q=$uri&$args;
}
location /myproject4 {
try_files $uri $uri/ myproject4/public/index.php?q=$uri&$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
The main problem is anyone can access the .env file as well as the other file that can be found in my root folder (.env , .htaccess , etc).We are using a Laravel framework to complete all the project. File can be downloaded via "http://192.168.1.1/myproject1/.env". What is the best way to prevent the user from downloading any of my files? I don't know if we missed something on our configuration or what.

How to rewrite if file not found using NGINX

I'm using NGINX On Ubuntu server. I have this vhost:
server {
listen 80;
server_name *.example.com;
root /home/nginx/vhosts/example.com/web;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
I have to add a rule...
If the file/dir IS NOT FOUND use index.php
How could I change my server {} directive?
Thank you!
You can use the try_files directive:
try_files $uri $uri/ /index.php
This will try to find files and directories first, and if that doesn't work, it will use index.php.
See also the front controller section on the nginx wiki.
Ikke is correct, use try_files like so:
location / {
try_files $uri $uri/ /index.php;
}
But your PHP fastcgi location is insecure. See this article to find out more about that.
For your setup you need to have something like this:
location ~ \.php$ {
try_files $uri /index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9001;
}
Note that you should set local fastcgi_param after including the fastcgi_params global config.
You need to fllow setting:
server {
listen 80;
server_name *.example.com;
root /home/nginx/vhosts/example.com/web;
location / {
index index.php;
}
location ~ \.php$ {
root /home/nginx/vhosts/example.com/web;
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
hope help you
I had the same problem on RH6 an EC2 and I fixed it by hard coding the $document_root, in the param fastcgi_param.
Hope it helped.

Resources