Reescreva regra para nginx (Opencart)

3

Opencart tem esta estrutura de URL:

http://example.com/index.php?route=common/home
http://example.com/index.php?route=account/register
http://example.com/index.php?route=checkout/cart
http://example.com/index.php?route=checkout/checkout

... e eu quero me livrar da string de index.php?route= até o primeiro / , o regex para isso é index.php\?route\=[^\/]*\/ , então o URL desejado seria, por exemplo, http://example.com/checkout .

Eu tentei:

location @opencart {
    rewrite index.php\?route\=[^\/]*\/ / last;
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
}

e também tentou:

location / {
  if ($query_string ~ "^route=common/home$"){
    rewrite ^/index\.php$ http://www.example.com? redirect;
  }
}

... mas sem sorte até o momento, ainda vejo route=common/home nas URLs.

Esta é a minha configuração atual do Nginx:

location / {
  try_files $uri @opencart;
}
location @opencart {
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
}
location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}
location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
    deny all;
}
location ~ /\.ht {
  deny all;
}
location /image/data {
    autoindex on;
}
location = /favicon.ico {
  log_not_found off;
  access_log off;
}
location = /robots.txt {
  allow all;
  log_not_found off;
  access_log off;
}
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
  expires max;
  access_log off;
}
    
por 3br4him 26.08.2016 / 13:46

5 respostas

0

Os URLs nas páginas da web que você recebe do OpenCart são gerados pelo software OpenCart. Você precisa procurar URLs amigáveis em sua configuração e ativá-los.

Em seguida, você pode aplicar as regras de rewrite correspondentes no nginx, para que as solicitações recebidas sejam roteadas para o OpenCart corretamente.

    
por 26.08.2016 / 14:10
0

As regras de reconfiguração podem traduzir rotas em solicitações recebidas de uma versão legal para uma versão com o apropriado, baseado em index.php, mas parece que essa é uma pergunta sobre o HTML gerado enviado nas respostas, que ainda é produzido com o índice Encantamento de .php? Para alterar as rotas baseadas em index.php nas respostas enviadas ao navegador, tente nginx 'ngx_http_sub_module:

link

Algo ao longo das linhas de:

sub_filter '/index.php?route=' '';
sub_filter_once on;

em conjunto com a reescrita pode ser suficiente.

    
por 30.08.2016 / 10:29
0

A diretiva try_files deve manipular a maior parte do trabalho. Eu não tenho o OpenCart instalado, portanto, o seguinte não foi testado. Pode ser um bom ponto de partida. A variável $uri incluirá um / inicial, que é excluído pelas regras .htaccess que vi. Se for problema, pode ser excluído com um pouco mais de trabalho.

location = /sitemap.xml {
    try_files /index.php?route=feed/google_sitemap =404;
}

location = /googlebase.xml {
    try_files /index.php?route=feed/google_base =404;
}

try_files $uri $uri/ /index.php?_route_=$uri;
    
por 02.09.2016 / 03:11
0

O seguinte parece bom?

map $arg_route $_dest { default "/"; "~*^(?:[^/]*)(?<dest>/.*)" $dest; }
server {
  location / {
    try_files $uri @opencart;
  }
  location @opencart {
    rewrite ^(?i)/index.php$    $_dest? last;
  }
}
    
por 02.09.2016 / 05:41
0

Isso pode ou não funcionar, dependendo de quão "inteligente" o Opencart a montante pensa que é.

A ideia é, de acordo com o link , para emitir redirecionamentos somente se index.php aparecer na solicitação original do usuário (em $request_uri ), mas não se estiver presente apenas como parte do roteamento interno (em $uri ). Por exemplo, pode parecer que o snippet abaixo resultaria em um loop, mas não deveria.

rewrite ^/([a-z]+/[a-z]+)$ /index.php?route=$1 last;
if ($request_uri ~ ^/index.php?route=([a-z]+/[a-z]+)$) {  return 301 /$1;  }

Como alternativa, se o processamento através de try_files já conseguir capturar 404 e redirecioná-lo para Opencart (por exemplo, se URLs sem a parte index.php?route= já funcionarem como você pretende), tudo o que você precisa é o seguinte:

if ($request_uri ~ ^/index.php?route=(.*)$) {  return 301 $1;  }
    
por 03.09.2016 / 19:42