Linux

在 Nginx 中使用重定向 301 刪除重複的 url 子目錄

  • January 24, 2019

我必須通過永久重定向 301 刪除在我網站的多個 URL 中重複的子目錄。

我需要有關 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;
       }
   }

}

我希望你能幫助我,了解這種重定向應該如何完成。

PS 重定向後,必須在針對 PHP 框架的最新指令下進行處理。/load.php?request=$1

謝謝你。

要使用 301 響應重定向,您需要使用rewrite...permanentor return 301 ...

要刪除 URI 的一部分,您需要在要刪除的部分之前和之後擷取 URI 的那些部分 - 很像location語句中的正則表達式。

例如:

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

有關詳細資訊,請參閱此文件

引用自:https://serverfault.com/questions/950429