我正在将一个站点从apache移动到nginx并坚持使用以下配置。
我的网站http://example.com/显示了主要(英文)版本。 此外,我还有一些语言可以使用相应的子目录打开。 http://example.com/de http://example.com/fr,http://example.com/es或http://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]
请指教。感谢。
答案 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;