Как переписать URL в nginx

#regex #nginx

Вопрос:

Я пытаюсь переписать языковую часть URL-адресов для своего веб-сайта. Например:

www.site.com/nl-NL Для www.site.com/nl-BE

и

www.site.com/nl-NL/test/rest Для www.site.com/nl-BE/test/rest

Я заставил работать первый, но он отсекает часть /test/rest для второго.

Я использую это в своей конфигурации nginx:

 rewrite ^/nl-NL/(.*)$ /nl-BE/$1 permanent;
 

Даже все URL-адреса /nl-BE/… перенаправляются на /nl-BE
Есть идеи, что я делаю не так?

Мой файл nginx:

 server {

  server_name site.com;

  root /var/www/staging/site/front;
  index  index.html index.htm index.php;

  auth_basic "Restricted Content";
  auth_basic_user_file /etc/nginx/.htpasswd;

  gzip on;
  gzip_min_length 128;
  gzip_comp_level 5;
  gzip_proxied any;
  gzip_vary on;
  gzip_types
    application/atom xml
    application/javascript
    application/json
    application/ld json
    application/manifest json
    application/rss xml
    application/vnd.geo json
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest json
    application/xhtml xml
    application/xml
    font/opentype
    image/bmp
    image/svg xml
    image/x-icon
    text/cache-manifest
    text/css
    text/plain
    text/vcard
    text/vnd.rim.location.xloc
    text/vtt
    text/x-component
    text/x-cross-domain-policy;

  set $skip_cache 1;

  location / {
    expires 1h;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options "SAMEORIGIN";

    add_header X-Cache-Status $upstream_cache_status;
    add_header X-Developer "Name";

    if ($request_uri ~* ".(ico|woff|woff2|css|js|svg|gif|jpe?g|png)$") {
      expires 100d;
      access_log off;
      add_header Pragma public;
      add_header Cache-Control "public";
      break;
    }

    if ($request_uri ~* ".(js)$") {
      expires 7d;
    }

    proxy_redirect                      off;
    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
    proxy_ignore_headers        Cache-Control;
    proxy_http_version          1.1;
    proxy_read_timeout          1m;
    proxy_connect_timeout       1m;
    proxy_pass                  http://127.0.0.1:3000;
    proxy_hide_header X-Powered-By;
  }
location /forms {
    set $skip_cache 1;
    try_files $uri $uri/ /forms.php?$query_string;
  }

  location /geoip {
    set $skip_cache 1;
    try_files $uri $uri/ /geoip.php?$query_string;
  }

  location /cacheclear.php {
    set $skip_cache 1;
    try_files $uri $uri/ /cacheclear.php?$query_string;
  }

  location /sitemap.xml {
    try_files $uri $uri/ /sitemap.php?$query_string;
  }



    location ~ .php$ {

    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    fastcgi_cache php_cache;
    fastcgi_cache_valid 200 999999999m;
    fastcgi_cache_methods GET;

            fastcgi_split_path_info ^(. ?.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param HTTPS on;
            #Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            fastcgi_param front_controller_active true;
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
    }

  location /nl-NL {
    rewrite ^/nl-NL$ /nl-BE permanent;
  }

listen 80;
}
 

Комментарии:

1. На первый взгляд не кажется, что в этой строке есть ошибка, могу ли я увидеть остальную конфигурацию?

2. Это довольно большой файл, но я только что добавил его

3. Вот одна идея, не уверен, что она сработает. location ~ ^/nl-NL(?<local_path>/.*) { rewrite ^/nl-NL/.*$ /nl-BE$local_path permanent; }

4. Как вы это проверяете? Используйте curl -I для проверки ответа от Nginx, так как браузеры могут давать запутанные результаты. rewrite В верхней части вашего вопроса все в порядке. rewrite В конфигурации, которую вы опубликовали, явно что-то не так.

5. @FonsVC Удалите этот location /nl-NL { ... } блок и добавьте rewrite ^/nl-NL(/?.*)$ /nl-BE$1 permanent; вместо него.