我如何像 Apache 那样管理 URI 中的语言?

我如何像 Apache 那样管理 URI 中的语言?

我正在尝试将网站从 apache 迁移到 nginx。在 apache 中,我有以下用于管理语言的配置:

RewriteRule fr/(.*) /$1?lang=fr [L,QSA]
RewriteRule en/(.*) /$1?lang=en [L,QSA]

我的根路径是/var/www

我的预期是:

  • 静态文件(js、图片、css 等)应按原样提供(例如:/css/common.css应提供/var/www/css/common.css
  • /重定向至/en/
  • /myscript.php重定向至/en/myscript.php
  • /(en|fr)/myscript.php当 uri 与nginx匹配时,应该/var/www/myscript.php使用查询提供服务?lang=(en|fr)
  • /(en|fr)/myscript.php?foo=bar当 uri 与nginx匹配时,应该/var/www/myscript.php使用查询提供服务?lang=(en|fr)&foo=bar

这是我的实际 nginx 配置:

root /var/www;
index index.php;
                                     
error_page 404 /error404.php;

location / {
     try_files $uri $uri/ =404;
}

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME     $fastcgi_script_name;
}

我该如何使用和来解决这个try_files问题rewrite

答案1

您想要重写以/en或开头的任何 URI /fr。在选择 来处理请求之前,将测试rewriteat范围,因此最简单的解决方案是:serverlocation

server {
    ...

    rewrite ^/(en|fr)(/.*)$ $2?lang=$1 last;

    location / { ... }
    location ~ \.php$ { ... }
}

这个文件了解详情。

相关内容