从 apache 到 nginx url rewrite( /* 到 index.html /$1/$2/* 到 /$1



你好,我尝试从apache迁移到nginx,但我坚持URL重写。

这适用于 NUXT SPA 应用程序。

对于 apache,我使用 .htaccess 来重写 url。
但不幸的是,nginx上没有htaccess...

以下是预期结果:

  • website.com/--->/index.html
  • website.com/ch/en--->/ch/en/index.html
  • website.com/ch/en/about-us--->/ch/en/index.html
  • website.com/ch/en/property/328383--->/ch/en/index.html
  • website.com/toto/lala--->/index.html
  • website.com/ch---->/index.html
  • website.com/_nuxt/file.js--->/_nuxt/file.js
  • website.com/data/file.jpeg--->/data/file.jpeg

注意到有很多不同的国家和语言,所以我认为手动编写所有重写不是一种选择。

我的文件夹结构如下所示:

dist/
.htaccess
index.html
_nuxt/
(nuxt generated files)
data/
(static file like image, json, etc...)
ch/
fr/
.htaccess
index.html
de/
.htaccess
index.html
be/
fr/
.htaccess
index.html
...

我的根 .htaccess 包含:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>

在我的子文件夹中,例如/ch/en

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /ch/en
RewriteRule ^index.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /ch/en/index.html [L]
</IfModule>

目前,我尝试遵循nginx.conf上的规则

...
location / {
index  index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /$1/$2/ {
index  index.html index.htm;
try_files $uri $uri/ /$1/$2/index.html;
}
...

但是 url 重写无法按预期工作:例如/ch/en
显示良好/ch/en/index.html
/ch/en/mypage显示/index.html而不是/ch/en/index.html

那么如何在nginx.conf上进行像/*->/index.html/$1/$2/->/$1/$2/index.html那样重写呢?

试试这个:

error_page 404 /index.html;
location / {
index      index.html index.htm;
try_files  $uri /index.html;
}
location ~ ^(/[^/]+/[^/]+) {
index      index.html index.htm;
try_files  $uri $1/index.html =404;
}

最新更新