Adiciona uma barra quando está faltando no nginx

5

Estou executando o Magento no Nginx usando esta configuração: link .

Agora, quero 301 todas as URLs sem barra ao lado de suas contrapartes, o que inclui uma barra à direita. Por exemplo: / contatos para / contatos /.

Eu tentei praticamente todas as diretivas nginx sobre isso eu poderia encontrar, mas sem sucesso. Por exemplo, a diretiva especificada em nginx- Reescreva a URL com Barra Trailing leva a um redirecionamento para /index.php /.

Qual diretiva devo adicionar e onde?

    
por vincent.io 29.10.2013 / 20:16

2 respostas

7

Encontrei a solução: adicionei a seguinte linha acima da diretiva "try_files" no bloco "location /":

rewrite ^([^.]*[^/])$ $1/ permanent;

qual é a mágica.

    
por 30.10.2013 / 09:40
1

Isso é muito, muito complicado, porque você precisa considerar todas as possibilidades em seus URLs. Vamos dar uma olhada mais de perto na configuração que você postou lá e otimizá-la ao tentar implementar seu desejo. Eu tenho que corrigir a configuração completa porque contém mais de um risco de segurança para o seu site (e continue lendo após a configuração).

server {
    server_name    DOMAIN.com;
    return         301 $scheme://www.$server_name$request_uri;
}

server {
    index          index.html index.php;
    listen         80 default;
    root           /var/www;
    server_name    www.DOMAIN.com;

    location / {

        # Hide ALL kind of hidden stuff.
        location ~ /\. {
            return 403;
        }

        # Protect Magento's special directories in document root.
        location ~* ^/(app|includes|lib|media/downloadable|pkginfo|report/config\.xml|var)/? {
            return 403;
        }

        # Directly deliver known file types.
        location ~* \.(css|gif|ico|jpe?g|js(on)?|png|svg|webp)$ {
            access_log      off;
            add_header      Cache-Control   "public";
            add_header      Pragma          "public";
            expires         30d;
            log_not_found   off;
            tcp_nodelay     off;
            try_files       $uri =404;
        }

        # Do not allow direct access to index.php
        location ~* ^(.*)index\.php$ {
            return 301 $1;
        }

        # Extremely risky ... oh boy!
        location ~* \.php/ {
            rewrite ^(.*\.php)/ $1 last;
        }

        # Not direct index.php access and not one of those ultra
        # risky php files with a path appended to their script name,
        # let's try to add a slash if it's missing.
        location ~* ^(.*)[^/]+$ {
            return 301 $1/;
        }

        location ~* \.php$ {
          include          fastcgi_params;
          fastcgi_index    index.php;
          fastcgi_param    PATH_INFO          $fastcgi_path_info;
          fastcgi_param    PATH_TRANSLATED    $document_root$fastcgi_path_info;
          fastcgi_param    SCRIPT_NAME        $fastcgi_script_name;
          fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;
          fastcgi_param    MAGE_RUN_CODE      "default";
          fastcgi_param    MAGE_RUN_TYPE      "store";
          fastcgi_pass     127.0.0.1:9000;

          # Ensure it's an actual PHP file!
          try_files        $uri =404;
        }
    }

    location ^~ /var/export/ {
        auth_basic              "Restricted";
        auth_basic_user_file    htpasswd;
        autoindex               on;
    }
}

IMPORTANTE! IMPORTANTE! IMPORTANTE! IMPORTANTE!

Eu não posso testar esta configuração, eu escrevi para o meu melhor conhecimento. Por favor, execute nginx -t antes de tentar reload do seu nginx e informe se isso relata algum erro. Não, repito, não teste isso em seu site de produção e teste tudo o que puder imaginar.

    
por 29.10.2013 / 23:30