我对Nginx服务器中的URL重写有问题。我想从我的网址中隐藏symfony的语言环境,因此www.example.com/fr/route应该是www.example.com/route 我的nginx配置文件具有以下内容:
location / {
# try to serve file directly, fallback to app.php
try_files $uri /app.php$is_args$args;
}
# PROD
location ~ ^/app\.php(/|$) {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
internal;
}
请帮助我,非常感谢。
我已经尝试使用.htaccess,但是nginx不支持.htaccess文件
答案 0 :(得分:2)
你好,欢迎来到论坛。
当您用url重写标记问题时,我假设您要实现url重写而不是其他东西。也就是说,URL重写不是“隐藏” URL的那部分,而是重写URL并删除了那部分-意味着您的symfony项目将无法使用此信息。
以下nginx规则将执行url重写:
rewrite ^/fr/(.*)$ /$1 permanent;
请注意,在测试/创建这些规则时,通常最好使用非永久选项:
rewrite ^/fr/(.*)$ /$1 redirect;
更新了有关如何“隐藏”语言环境的信息
这是您必须在symfony项目中要做的事情,而不是使用nginx。不过,作为警告,symfony文档明确建议不要使用这种语言环境隐藏(请参见The locale and the url)。但是,如果您出于某种原因仍想进行这种语言环境隐藏,那么我认为一种方法是创建用于处理语言环境的通用捕获程序路由,如下所示:
locale_redirect:
path: /{_locale}/{params}
controller: App\Controller\LocaleRedirectController::locale
requirements:
_locale: en|fr|de
params: '.+'
在您的控制器中,如下所示:
public function localeAction(Request $request, $locale, $params)
{
// set the locale sticky
// https://symfony.com/doc/current/session/locale_sticky_session.html
// redirect to the url without the locale
return new RedirectResponse("/$params");
}
我实际上没有尝试过此代码/逻辑-并且不会这样做,因为symfony文档建议(出于正当理由)不建议这样做-因此,您可能需要在此示例代码/此逻辑中存在一些小问题如果您决定采用这种方式,请自己弄清楚。