簡體   English   中英

nginx重定向到尾部斜杠,並替換為index.php(如果文件和文件夾不存在)

[英]nginx redirect to trailing slashes and substitude to index.php (if files and folders don't exists)

我想用301重定向所有沒有結尾斜杠的URL到帶有結尾斜杠的相同URL。 另外,如果不是文件夾或文件,我想將所有URL都歸並到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?

我找到了可行的解決方案。 它使用了錯誤的做法(如果是邪惡的話),但這只是有效的代碼。 因此,如果有任何更好的決定,我將不勝感激。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM