Nginx conf how to remove leading slash from $uri - nginx

My Nginx conf file :
location / {
try_files $uri $uri/ /index.php?url=$uri;
}
## PHP conf in case it's relevant
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include /etc/nginx/fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Trying the following URL : http://example.org/login :
expected behavior :
http://example.org/index.php?url=login
actual behavior :
http://example.org/index.php?url=/login

Use a named location and an internal rewrite. For example:
location / {
try_files $uri $uri/ #rewrite;
}
location #rewrite {
rewrite ^/(.*)$ /index.php?url=$1 last;
}
See this document for more.

Related

nginx rewrite configuration issue

I need an Nginx configuration for the following requirements. I tried several methods but it's not working.
For Example: If I run the following URL in the browser, http://example.com/admin/test/update/image/list/100 Need to convert to http://example.com/admin/index.php?test/update/image/list/100. How to configure it in Nginx. if you have any idea about this please guide me. Thanks.
My Nginx configuration:
server {
server_name example.com;
root /home/example/public_html;
index index.php home.php login.php;
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml|rss|txt) {
try_files $uri $uri/ =404;
}
location / {
try_files $uri $uri/ =404;
}
location /admin/ {
rewrite ^ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/?$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)/$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)/([^\.]+)$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)/([^\.]+)/$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)/([^\.]+)/([^\.]+)$ /admin/index.php?$1 break;
rewrite ^/([^\.]+)/([^\.]+)/([^\.]+)/([^\.]+)/$ /admin/index.php?$1 break;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php5.6-fpm-example.com.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php5.6-fpm-example.com.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}

Nginx try_files remove client_max_body_size option

I have a trouble to setup my nginx.conf for my symfony application. I want to setup a route /section/upload/ that allows to increase the size of the client_max_body_size (~100M, standard client_max_body_size = 25M)
http {
### ....
client_max_body_size 25M;
server {
location / {
try_files $uri /index.php$is_args$args;
location /section/upload {
client_max_body_size 100M;
try_files $uri /index.php$is_args$args;
}
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
### ... specific fastcgi_param needed by my symfony application
### like : fastcgi_param APP_ENV prod;
}
}
}
I get an error when I send a file larger than 25M on the /section/upload route. To avoid this I have to put the parameter client_max_body_size=100M in location ^/index.php(/|$).
I think try_files doesn't follow my client_max_body_size, is it normal and is it good/safe to setup like that ?
The try_files directive rewrites the URI to /index.php which is then processed in a different location. To set a different value for client_max_body_size, you will need to process /index.php within the location /section/upload block.
For example:
location / {
try_files $uri /index.php$is_args$args;
}
location /section/upload {
client_max_body_size 100M;
try_files /index.php =404;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
include fastcgi_params;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
}
The try_files statement is changed so that /index.php appears as a file parameter and not a URI parameter. Most of the FastCGI directives are also required. See this document for details.

Ngnix downloading php

I am trying to get nginx to route all requests starting with /embed to /home/forge/dev.tline.io/embed/index.php
My Nginx config:
location /embed {
root /home/forge/dev.tline.io;
try_files /embed/index.php =404;
}
location / {
root /home/forge/dev.tline.io;
index index.html index.htm;
try_files $uri$args $uri$args/ $uri $uri/ /index.html =404;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
All requests go to /embed/index.php but it doesn't run the php file it downloads it.
Note: http://dev.tline.io/embed/index.php is compiled not downloaded
I got it to work if add
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
into location /embed but there should be a better way to do this
This should execute /embed/index.php for all /embed URLs:
server {
root /home/forge/dev.tline.io;
location / {
index index.html index.htm;
try_files $uri$args $uri$args/ $uri $uri/ /index.html =404;
}
location /embed {
fastcgi_param SCRIPT_NAME $document_root/embed/index.php;
fastcgi_param SCRIPT_FILENAME $document_root/embed/index.php;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
include fastcgi_params;
}
}
Please try out the following code,
map $request_uri $rot {
"~ /embed" /home/forge/dev.tline.io/embed/;
default /home/forge/dev.tline.io/;
}
map $request_uri $ind {
"~ /embed" index.php;
default index.html;
}
server {
...
root $rot;
index index.php index.html index.htm;
...
location / {
try_files $uri$args $uri$args/ $uri $uri/ /$ind =404;
}
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;
include fastcgi_params;
}
...
}
If this doesn't work out, try switching $ind position suitably, and check error log in case of extra '/' found.

Conditionally prepend path to url in NGINX

I have this directory structure for my projects
/var/www
/project-a
/data <-- configuration and user files/data
/app <-- all the code is in sub-dirs in here
/pm <-- a home brew project management app
/.pmdata <-- data used by pm
My goal is to configure NGINX so I can access the project itself through
http://project-a.dev/ and the project management with http://project-a.dev/pm/.
In other words, I want the second url preserved as is, but if the url does not point to /pm/* it should be re-written to have the missing /app prepended to it.
I have tried the following configuration but http://project-a.dev/pm/ results in 404 and http://project-a.dev/ first redirects to http://project-a.dev/app/ and then gives 404.
What am I doing wrong?
server {
listen 127.0.0.1:80;
root /var/www/project-a;
index index.php index.html index.htm;
server_name project-a.dev;
location / {
try_files $uri $uri/app $uri/app/ =404;
}
location ~ \.php$ {
try_files $uri =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;
}
}
Alternatively you could append /app to the root value for all URIs that do not begin with /pm. For example:
server {
...
root /var/www/project-a/app;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
location ^~ /pm {
root /var/www/project-a;
try_files $uri $uri/ =404;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
}
}
The nested location block for location ~ \.php$ executes PHP files within the /pm hierarchy. The ^~ modifier is necessary to avoid the other location ~ \.php$ block taking control. See this document for details.

URL Parameters and Rewrite

I am somewhat new to nginx and am having a hard time with the rewrites. I am trying to get:
/c/545_453453_4534
to access c.php passing 545_453453_4534 in as params
Here is my current conf:
location / {
try_files $uri $uri/ #extensionless-php;
index index.html index.htm index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:8000;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location #extensionless-php {
rewrite ^(.*)$ $1.php last;
}
Thanks!
In your NGINX server block you need to add:
rewrite ^/c/([^/]*)$ /c.php?param=$1 last;
What I tend to do is generate my re-write Apache style then convert it to NGINX format using:
http://www.anilcetin.com

Resources