配置nginx语言子目录

时间:2016-09-30 06:38:53

标签: regex apache mod-rewrite nginx url-rewriting

我正在将一个站点从apache移动到nginx并坚持使用以下配置。

我的网站http://example.com/显示了主要(英文)版本。 此外,我还有一些语言可以使用相应的子目录打开。 http://example.com/de http://example.com/frhttp://example.com/eshttp://example.com/es/(带有斜杠)。

这些子目录是虚拟的(不存在的),但应该从根目录打开相同的页面。 php脚本处理语言表示。

现在英文网站工作正常,但其他语言不起作用。 我可以打开http://example.com/es/(仅使用尾随字符)并打开主页面,但是,无法访问所有其他页面(例如http://example.com/es/test.html这是一个seo朋友网址)。我已经在SO上回顾了很多类似的问题和答案,但是没有对它们有帮助。 这是我的配置:

server {
    ....
    root /var/www;
    index index.php index.html index.htm;

    location / {
            rewrite ^/(de|fr|it|es)\/(.*)$ /$2;
            try_files $uri $uri/ @fallback;
    }

    location @fallback {
            rewrite  ^(.*)$ /seo.php?$args last;
    }

    location ~* \.(jpeg|ico|jpg|gif|png|css|js|pdf|txt|tar|gz|wof|csv|zip|xml|yml) {
            access_log off;
            try_files $uri @static;
            expires 14d;
            add_header Access-Control-Allow-Origin *;
            add_header Cache-Control public;
            root /var/www;
    }

    location @static {
            rewrite ^/(\w+)/(.*)$ /$2 break;
            access_log off;
            rewrite_log off;
            expires 14d;
            add_header Cache-Control public;
            add_header Access-Control-Allow-Origin *;
            root /var/www;
    }

    location /backend/ {

            rewrite  ^(.*)$ /backend/index.php last;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
    }
}

它以前在apache上工作如下:

RewriteRule ^(de|fr|it|es)\/(.*)$ $2
RewriteCond %{REQUEST_URI} !^/(backend|template)/
RewriteCond %{REQUEST_FILENAME} !\.(gif|jpeg|png|js|css|swf|php|ico)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ seo.php [L]

请指教。感谢。

1 个答案:

答案 0 :(得分:1)

显然,在应用重写之前,Apache正在将/es转换为/es/。除非目录确实存在,否则nginx将不会这样做。

但是,通过调整正则表达式并使尾部斜杠可选,可以很容易地解决这个问题。

试试这个:

rewrite ^/(?:de|fr|it|es)(?:/(.*))?$ /$1;

(:? )构造是非捕获组。

编辑:

如果您希望添加尾部斜杠"可见",那么您将需要重定向。例如:

rewrite ^/(de|fr|it|es)$ /$1/ permanent;
rewrite ^/(?:de|fr|it|es)/(.*)$ /$1 last;