Удалить повторяющийся подкаталог URL-адреса с перенаправлением 301 в Nginx

Мне нужно удалить подкаталог, который был продублирован в нескольких URL-адресах моего сайта с помощью постоянного перенаправления 301.

I ' m нужна помощь с настройкой Nginx.

Например:
http://example.com/foo/DIR/DIR/bar -> http://example.com/foo/DIR/bar

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

Мой текущая конфигурация сервера nginx:

server {

    listen 443 ssl http2 fastopen=500 reuseport;
    listen [::]:443 ssl http2 fastopen=500 reuseport ipv6only=on;
    server_name www.example.com;
    resolver 1.1.1.1 1.0.0.1 valid=300s;

    charset utf-8;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/nginx/snippets/diffie-hellman;

    root /var/www/webdisk/example.com/htdocs;

    autoindex off;
    index load.php index.php index.html;

    include /etc/nginx/snippets/security;
    include /etc/nginx/snippets/expires;
    include /etc/nginx/snippets/error_pages;
    include /etc/nginx/snippets/pagespeed;

    location ~ \.php$ {
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass unix:/run/php/php7-fpm.sock;
        fastcgi_send_timeout 1200s;
        fastcgi_read_timeout 1200s;
        fastcgi_connect_timeout 75s;
    }

# TODO: http://example.com/foo/DIR/DIR/bar --> http://example.com/foo/DIR/bar

    location ~* ^/(.+)$ {
        if (-f $document_root/public/prov/$1.html) {
            rewrite ^(.+)$ /public/prov/$1.html last;
            break;
        }
        if (!-e $request_filename){
            rewrite ^(.+)$ /load.php?request=$1 last;
            break;
        }
    }

}

Надеюсь, вы поможете мне понять, как следует выполнять такое перенаправление.

P.S. После перенаправления оно должно быть обработано в соответствии с последней директивой PHP Framework. /load.php?request=$1

Спасибо.

3
задан 24 January 2019 в 15:00
1 ответ

Для перенаправления с ответом 301 необходимо использовать rewrite ... постоянный или return 301 ... .

Чтобы удалить часть URI, вам необходимо захватить те части URI как до, так и после удаляемой части - во многом аналогично регулярному выражению в вашем операторе location .

Например:

rewrite ^(.*)/DIR/DIR(.*)$ $1/DIR$2 permanent;

Подробнее см. этот документ .

1
ответ дан 3 December 2019 в 07:21

Теги

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