Удалить расширение .php с помощью NGINX

Я нахожусь на веб-сервере NGINX и хочу удалить расширение .php из URL-адреса.

В настоящее время у меня есть следующая конфа:

server {
    server_name www.mywebsite.com mywebsite.com;
    return 301 https://mywebsite.com$request_uri;
}
server {
    listen 443 ssl;

    server_name www.mywebsite.com;
    return 301 https://mywebsite.com$request_uri;

    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}
server {
    listen 443 ssl;
    root /opt/http/nginx/sites/mywebsite/www;
    index index.php index.html;
    server_name mywebsite.com;

    location / {
        #rewrite ^(/.*)\.html(\?.*)?$ $1$2 permanent;
        try_files $uri $uri/ $uri.php?$args;
    }

    location ~*  \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }

    location ~*  \.(pdf)$ {
        expires 30d;
    }

    client_max_body_size 3M;

    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

    error_page 403 /index.php;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    access_log   /var/log/nginx/www.mywebsite.access.log;
    error_log   /var/log/nginx/www.mywebsite.error.log;
}

Если попытаться выполнить некоторые аналогичные инструкции, но, похоже, ничего не работает с моей conf.

Проблема в том, что этот кусок кода

location / {
    try_files $uri $uri/ $uri.php?$args;
}

хорошо работает в двух случаях:

  1. Клиент запрашивает https://mywebsite.com/page.php: OK
  2. Клиент запрашивает https://mywebsite.com/page: OK

без перезаписи URL!

Что мне нужно, так это сказать NGINX переписать URL-адрес, если клиент попытается получить доступ к странице с расширением файла. Например, если я запрашиваю login.php, nginx перезаписывает «логин» и так далее.

Он также должен сохранять параметры GET в URL-адресе, если он есть.

Итак, какова правильная конфигурация для этого, учитывая, что я сохраняю в своем коде ссылки на php-файлы с расширением, а не относительные URL-адреса (надеюсь, NGINX сможет их переписать)? (если мне нужно установить относительные URL-адреса в моем коде, я могу, но я не хочу нарушать свой локальный)


person Maxime Lafarie    schedule 01.07.2016    source источник
comment
Возможный дубликат удалить .php из URL с правилом перезаписи   -  person Black Sheep    schedule 01.07.2016
comment
Да, я следовал инструкциям, данным в этом посте, но ничего не получилось...   -  person Maxime Lafarie    schedule 01.07.2016
comment
Просто добавьте rewrite ^(/.+)\.php$ $scheme://$host$1 permanent; в блок server {}, и он всегда переписывает URL-адрес без расширения .php!   -  person Maxime Lafarie    schedule 17.07.2020


Ответы (1)


location / {
        try_files $uri $uri.html $uri/ @extensionless-php;
        index index.html index.htm index.php;
    }

    location ~ \.php$ {
        try_files $uri =404;
    }

    location @extensionless-php {
        rewrite ^(.*)$ $1.php last;
    }

Это удалит URL-адрес формы html и php. ">Подробнее

person Muhammad Usman    schedule 01.07.2016