我有一个MediaTemple服务器,我可以从中服务很多网站。我使用nginx并拥有以下配置文件。我正确地将所有非www流量(即http://example.com)转发到相应的目录。但是,所有www流量都返回404,因为我的配置文件正在寻找/directory-structure/www.sitename.com而不是/directory-structure/sitename.com
如何将www和非www请求转到一个目录?感谢。
server {
listen 80;
server_name _;
root /var/www/vhosts/$host/httpdocs/;
error_page 404 /;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
#fastcgi_pass php;
fastcgi_pass 127.0.0.1:9000;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
# this prevents hidden files (beginning with a period) from being served
location ~ /\. { access_log off; log_not_found off; deny all; }
}
答案 0 :(得分:3)
从版本0.7.40开始,Nginx接受server_name
中的正则表达式并捕获。因此,可以提取域名(没有www
)并在root
指令中使用此变量:
server_name ~^(?:www\.)?(.+)$ ;
root /var/www/vhosts/$1/httpdocs;
从0.8.25开始,可以使用命名捕获:
server_name ~^(?:www\.)?(?P<domain>.+)$ ;
root /var/www/vhosts/$domain/httpdocs;
定义命名捕获的另一种语法是(?<domain>.+)
(PCRE 7.0及更高版本)。有关PCRE版本here
答案 1 :(得分:1)
尝试此操作并在上面的服务器配置中添加以下内容:
if ($host = "www.example.com") {
rewrite (.*) http://example.org$1;
}
这里发生了什么,即使浏览器网址显示为nginx
,我们也会http://example.com
指示将这些网页作为http://www.example.com
提供服务 - 我希望这会有效。
<强>更新强>
尝试使用通用版本:
if ($host ~* "www.(.*)") {
rewrite ^ http://$1$request_uri?;
}
答案 2 :(得分:0)
鉴于RakeshS答案评论中与if
相关的潜在问题,以及RakashS的答案对我来说无效的事实,这里的解决方案对我来说应该更安全并且对我有用Nginx 1.0.14。
为每个执行重写的服务器部分添加一个额外的服务器条目:
server {
server_name www.yourwebsite.com;
rewrite ^ $scheme://yourwebsite.com$request_uri permanent;
}