nginx 的重写规则(Opencart)

nginx 的重写规则(Opencart)

Opencart 具有以下 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

...我想要删除从index.php?route=到第一个 的字符串/,该正则表达式是index.php\?route\=[^\/]*\/,因此所需的 URL 将是 ,例如http://example.com/checkout

我试过:

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

并尝试过:

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

...但到目前为止还没有运气,我仍然route=common/home在 URL 中看到。

这是我当前的 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;
}

答案1

您从 OpenCart 收到的网页中的 URL 由 OpenCart 软件生成。您需要在其配置中查找友好 URL,然后启用它们。

然后您可以rewrite在 nginx 中应用相应的规则,以便传入的请求正确路由到 OpenCart。

答案2

重写规则可以将传入请求中的路由从一个不错的版本转换为具有适当的基于 index.php 的咒语的版本,但这听起来像是关于响应中发送的生成 HTML 的问题,该 HTML 仍然是使用 index.php 咒语生成的?要更改发送到浏览器的响应中的基于 index.php 的路由,请尝试 nginx 的 ngx_http_sub_module:

http://nginx.org/en/docs/http/ngx_http_sub_module.html

大致如下:

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

结合重写可能就足够了。

答案3

try_files指令应该可以处理大部分工作。我没有安装 OpenCart,因此以下内容未经过测试。不过,这可能是个不错的起点。该$uri变量将包含一个前导/,据我所知,.htaccess 规则会排除该变量。如果存在问题,只需再做一些工作即可将其排除。

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;

答案4

这可能会或可能不会起作用,取决于上游 Opencart 认为自己有多“智能”。

这个想法是,按照https://stackoverflow.com/questions/21687288/nginx-redirect-loop-remove-index-php-from-url/21813759#21813759index.php,仅当出现在用户的原始请求中时才发出重定向(在$request_uri),但如果它只是作为内部路由的一部分存在(在$uri)。例如,下面的代码片段似乎会导致循环,但事实并非如此。

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

或者,如果您的处理try_files已经可以捕获404,并将其重定向到 Opencart(例如,如果没有该index.php?route=部分的 URL 已经按您的意图工作),那么您所需要的只是以下内容:

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

相关内容