nginx重定向到尾随斜杠和index.php的替代(如果文件和文件夹不存在)

时间:2017-12-05 12:12:35

标签: php redirect nginx

我想重定向所有没有tralin斜线的网址,301重定向到带有斜杠的相同网址。此外,我想将所有网址都替换为index.php,如果它不是文件夹或文件。

我尝试使用以下代码进行此操作:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

location ~* .*[^/]$ {
  try_files $uri $uri/ permanent;
}

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-mysite-fpm.sock;
  fastcgi_read_timeout 300;
}

第一个位置单独工作完美,但这个位置不能一起工作。它通常返回文件和文件夹,但是当没有斜杠的请求URL时,nginx返回500错误,只返回文件index.php进行下载,当带有斜杠的url时。

我也尝试用代码制作它:

location / {
    try_files $uri $uri/ @addslash /index.php$is_args$args;
}
location @addslash {
    rewrite ^(.+[^/])$ $1/ permanent;
}
location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-mysite-fpm.sock;
  fastcgi_read_timeout 300;
}

但它没有任何重定向来自网址没有拖尾斜杠。

如何使重定向到斜杠和index.php的替换?

1 个答案:

答案 0 :(得分:0)

我找到了工作解决方案。它使用了不好的做法(如果是邪恶的),但它只是工作代码。因此,如果有任何更好的工作决定,我将不胜感激。

set $my_var 0;
if (-f $request_filename) {
  set $my_var 1;
}
if (-d $request_filename) {
  set $my_var 1;
}
if (-d $request_filename) {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/cart$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/accept$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/status$") {
  set $my_var 1;
}
if ($request_uri ~* "(.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$") {
  set $my_var 1;
}

if ($my_var = 0) {
  rewrite ^(.*[^/])$ $1/ permanent;
}

if ($request_uri ~* "^(.*/)index\.php$") {
  return 301 $1;
}


location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
  try_files $uri $1.$2;
}

location / {
  try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-newstom-fpm.sock;
  fastcgi_read_timeout 300;
}