Nginx перезаписывает, сбрасывает перезаписывает или добавляет расширения в определенный каталог

Вот конфигурация моего сайта nginx:

server {
server_name DOMAIN.COM;
access_log /srv/www/DOMAIN.COM/logs/access.log;
error_log /srv/www/DOMAIN.COM/logs/error.log;
root /srv/www/DOMAIN.COM/public_html;

location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1$is_args$args;  }
    try_files $uri =404;
}

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

}

Как мне сделать так, чтобы "domain.com/directory/" НЕ перезаписывал URL-адреса и не сохранял расширения файлов? Например, сделайте так, чтобы «domain.com/directory/filename» и все другие файлы в каталоге были переписаны на «domain.com/directory/filename.php», но во всех остальных каталогах удалили «.php».

2
задан 6 February 2016 в 02:30
1 ответ

Предлагаемое решение (показывает только блоки местоположения):

location ~ ./$ { rewrite ^(.*)/ $1 last; }

location / {
    if ($request_uri ~ ^(.*)\.(php|htm)) { return 302 $1$is_args$args; }

    try_files $uri $uri/index.html $uri/index.htm @php;
}

location @php {
    try_files $uri.php $uri/index.php =404;

    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass  127.0.0.1:9000;
}

location /somedirectory {
    rewrite ^(.*)\.php$ $1 break;

    try_files $uri $uri/index.html $uri/index.htm @php;
}

Блок location ~ / $ молча удаляет любой завершающий слэш, поскольку это мешает работе try_files позже.

Обратите внимание, что блок location ~ \ .php $ был удален, поэтому URI .php теперь обрабатываются в location / ].

Блок location / будет перенаправлять URI с расширением .html и .php (что согласуется с двумя , если блоков из исходной конфигурации.

Блок location / пробует несколько URI, включая список из директивы index (кроме index.php , который обрабатывается позже).

Обратите внимание, что элемент $ uri / и директива index больше не используются.

Последнее действие - вызвать именованный Locati в блоке @php для обработки файлов .php и index.php .

До этого момента функциональность аналогична вашей существующей конфигурации.

location / somedirectory изменяет поведение URI ниже somedirectory . Он позволяет URI .php сохранять свое расширение, молча удаляя его до директивы try_files .

1
ответ дан 3 December 2019 в 12:42

Теги

Похожие вопросы