nginx从URL隐藏symfony语言环境

时间:2018-11-26 13:15:49

标签: symfony nginx url-rewriting

我对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文件

1 个答案:

答案 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文档建议(出于正当理由)不建议这样做-因此,您可能需要在此示例代码/此逻辑中存在一些小问题如果您决定采用这种方式,请自己弄清楚。