How to remove trailing slash from URL in nginx only if directory doesn't
exist?
I am running a server on nginx 1.4.1 with PHP-FastCGI. Currently I have it
setup so that it removes trailing slashes from my URLs. However, when I
visit a directory that exists, I am forced into a redirect loop. My
current document root looks like this:
- index.php (app)
- webgrind
- index.php
- static
- css
Currently I cannot visit example.com/webgrind or any other directory. My
access logs repeatedly read similar to:
GET /webgrind/ HTTP/1.1" 301 178 "-"
GET /webgrind HTTP/1.1" 301 178 "-"
This is the server block in my nginx.conf:
server {
listen 80;
server_name example.com;
location / {
try_files $uri $uri/ /index.php?$args;
root /var/www/example/public;
index index.php index.html index.htm;
}
rewrite ^/(.*)/$ /$1 permanent;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location ~ \.php$ {
try_files $uri $uri/ /index.php?$args;
root /var/www/example/public;
index index.php index.html index.htm;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
/var/www/example/public$fastcgi_script_name;
fastcgi_param APPLICATION_ENV testing;
fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin;
fastcgi_intercept_errors on;
include fastcgi_params;
}
}
I am aware that rewrite ^/(.*)/$ /$1 permanent; is the offending line. If
I remove it and visit example.com/webgrind, a 301 is issued for me to
redirect to example.com/webgrind/ since it is a directory. However, my
application will accept both trailing and non-trailing slashes (i.e.
example.com/users/ and example.com/users) and this is not what I want.
Wrapping the 'if' directive around my rewrite as follows still creates a
redirect loop for my directories (if is evil, apparently, but a rewrite
directive in this case is considered safe):
if (!-d $request_filename) {
rewrite ^/(.*)/$ /$1 permanent;
}
(I know that visiting webgrind/index.php would solve my problem, but I'd
like to avoid costly and unprofessional redirect loops when my production
directories are pushed live.)
So how can I conditionally strip trailing slashes only for resources that
don't exist (my web application paths)?
No comments:
Post a Comment