nginx переписывает с исключениями - PullRequest
3 голосов
/ 08 июля 2011

У меня есть сайт, который недавно изменил свою структуру страницы, чтобы добавить возможность для нескольких языков (/en/ для английского, /fr/ для французского).У меня есть следующие правила перезаписи в my server {} блоке:

    try_files $uri $uri/ @abc;
    location @abc {
            if ($uri !~ "^/(.*)\/(.*)$") {
                    rewrite ^/(.*)$ /en/$1 permanent;
            }
            rewrite ^/(.*)\/(.*)$ /index.php?lang=$1&page=$2;
    }
    rewrite ^/$ /en/$1 permanent;

Это немного беспорядок, но я не могу выполнить то, что мне нужно:

  • Все ссылки должны быть проверены, чтобы увидеть, существует ли файл (работает)
  • Все «старые» ссылки, такие как /abc, должны быть от 301 до /en/abc (работает, но кажется хакерским)
  • Корень сайта должен быть перенаправлен на /en/ (работает)
  • Ссылки в формате /en/abc должны быть отправлены на index.php как ?lang=$1&page=$2 (включая /en/abc/123, где abc/123 равно $2 и en равно $1).$2 может иметь любую длину, например abc/123/456

То, что у меня «кажется» работает нормально, но на подстраницах abc/123, похоже, для $1 установлено en/abc и $2 до 123, что нежелательно и приводит к ошибке 404, так как скрипт не может найти страницу 123.Заранее спасибо за любые ответы!

1 Ответ

2 голосов
/ 08 июля 2011

Попробуйте это

try_files $uri $uri/ @abc;
location @abc {
        if ($uri !~ "^/([^\/]*)\/([^\/]*)$") {
                rewrite ^/(.*)$ /en/$1 permanent;
        }
        rewrite ^/([^\/]*)\/([^\/]*)$ /index.php?lang=$1&page=$2;
}
rewrite ^/$ /en/$1 permanent;

У меня есть замена .* на [^\/]*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...