I've tried so many different configurations to enable permanent redirection of any request ending with .php to redirect to itself without .php.
The issue is, I can't get a rule to redirect requests made to any directory with /index.php to redirect to / instead of /index.
Example:
Desired behavior = /blog/index.php -> /blog/ Current behavior = /blog/index.php -> /blog/index
Is there a clean solution to have any request containing "index.php" to remove itself from the request to simply /, all while still removing .php from all other requests not including index.php?
The two problem lines I can't get to function as desired:
if ($request_uri ~* "^(.*/)index\.php$") { return 301 $1; }
if ($request_uri ~ ^/(.*)\.php$) { return 301 /$1; }
Config:
# Upstream
upstream backend {
server unix:/var/run/php5-fpm.sock;
}
server {
listen 443 ssl;
server_name mysite.net;
# Serving
root /var/www/html/mysite;
charset utf-8;
index index.php;
# Resources
location / {
try_files $uri $uri/ @extensionless-php;
}
location @extensionless-php {
rewrite ^(.*)$ $1.php last;
}
location ~* /includes/(.+)\.php$ {
deny all;
}
location ~ \.php {
try_files $uri =404;
fastcgi_pass backend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Status
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}