nginx 配置文件的一个疑问

宏哥 发布于 2014/06/04 21:40
阅读 371
收藏 2

这个配置文件是用来配对所有 www.host.com 这样格式的网址

当访问 www.host.com/en/ 的时候, 希望 nginx 自动抓起 /var/sites/com/host/www/en/index.html文件

目前其他都是正常, 唯独 

http://www.host.com/en/index.html 可以抓起到 index.html文件, 但是 访问http://www.host.com/en 或者 http://www.host.com/en/ 的时候, nginx仍然认为文件不存在, 会将访问提交 index.php


目前看来, index 指令并没有生效.

# You may add here your
# server {
#	...
# }
# statements for each of your virtual hosts
server {
	listen   80 default;
	server_tokens off;

	charset utf-8;
	server_name ~^(?:(.*)\.)?(.*)\.(.*)$;
	set $sub_parse $1;
	set $sub 'www';	
	if ($sub_parse){
		set $sub $sub_parse;
	}
	set $domain $2;
	set $domain_type $3;

	if ($sub_parse !~ (\w+)){
		rewrite (.*) http://$sub.$domain.$domain_type$request_uri permanent;
	}

	access_log  /var/log/nginx/$sub.$domain.$domain_type.access.log;
	root   /var/www/sites/$domain_type/$domain/$sub;
	gzip  off;
	gzip_static on;
	index  index.html;
#This is to redirect when Direct not exists
#error_page  403 =200  /index.php;
	error_page  403   /index.php;

	location /favicon.ico {
		root  /var/www/default;
	}

	location /{

		if (!-e $request_filename){
			rewrite ^/(.*)$ /index.php;
		}

		if (-e $request_filename){
			expires modified +7d; 
		}

		location ~ \.php$ {
			fastcgi_pass   unix:/var/run/fpm.sock;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME  /webserver/dep/run/ccd/index.php;
#			fastcgi_param  HTTPS yes;
			include        /etc/nginx/fastcgi_params;
		}
	}

	#error_page  404  /404.html;

	# redirect server error pages to the static page /50x.html
	#
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   /var/www/default;
	}

	# proxy the PHP scripts to Apache listening on 127.0.0.1:80
	#
	#location ~ \.php$ {
		#proxy_pass   http://127.0.0.1;
	#}

	# pass the PHP scripts to FastCGI server listening on unix:/var/run/fpm.sock
	#
	
	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
		#deny  all;
	#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#listen   8000;
#listen   somename:8080;
#server_name  somename  alias  another.alias;

#location / {
#root   html;
#index  index.html index.htm;
#}
#}


# HTTPS server
#
#server {
#listen   443;
#server_name  localhost;

#ssl  on;
#ssl_certificate  cert.pem;
#ssl_certificate_key  cert.key;

#ssl_session_timeout  5m;

#ssl_protocols  SSLv2 SSLv3 TLSv1;
#ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#ssl_prefer_server_ciphers   on;

#location / {
#root   html;
#index  index.html index.htm;
#}
#}



以下是问题补充:

@宏哥: 如果我把 error_page 403 /index.php; 注释掉 则报 404的错误. not found, 实际上, index.html 文件是存在的. 并且可以通过 www.host.com/en/index.html访问到 实际上 en的目录是存在的, 理论上说, nginx应该根据index指令寻找index.html (2014/06/04 21:55)
加载中
0
blindcat
blindcat
039         if(!-e$request_filename){
040             rewrite ^/(.*)$ /index.php;
041         }

这里是不是都给重定向到index.php了?

@腾勇 出来帮忙

0
皮总
皮总
fastcgi_index index.html index.php;
0
宏哥
宏哥

引用来自“皮总”的评论

fastcgi_index index.html index.php;

试试看, 但是应该还未进入fast cgi 就已经找不到了

如果我把 error_page  403   /index.php; 注释掉

则报 404的错误. not found, 

实际上, index.html 文件是存在的. 并且可以通过 www.host.com/en/index.html访问到

宏哥
宏哥
回复 @皮总 : 非常奇怪, 感觉 index指令在这个配置下失效了, nginx没有测试目录是否存在, 也没有执行index指令.
皮总
皮总
明天到公司试,现在没这个环境试,这个肯定是可以搞定的。
0
宏哥
宏哥

@皮总

我已经将配置文件简化为下面这个, 其实问题就出在这个配置, 无法找到对应的index.html文件

比如 www.host.com , 无法指向 www.host.com/index.html

如果用 www.host.com/index.html就可以访问到文件.

server {
	listen   80 default;
	server_tokens off;

	charset utf-8;
	server_name ~^(?:(.*)\.)?(.*)\.(.*)$;
	set $sub_parse $1;
	set $sub 'www';	
	if ($sub_parse){
		set $sub $sub_parse;
	}
	set $domain $2;
	set $domain_type $3;

	if ($sub_parse !~ (\w+)){
		rewrite (.*) http://$sub.$domain.$domain_type$request_uri permanent;
	}

	access_log  /var/log/nginx/$sub.$domain.$domain_type.access.log;
	root   /var/www/sites/$domain_type/$domain/$sub;
	gzip  off;
	gzip_static on;
	index  index.html;
}



0
皮总
皮总
宏哥不急,一定能搞定。
宏哥
宏哥
问题我已经定位了: root /var/www/sites/$domain_type/$domain/$sub; 上面这句会让 nginx傻掉, 不知道去找 index, 如果我改写为 root /var/ww/sites/com/host/www 就可以了. 是根据楼上的简化文件测试的.
0
宏哥
宏哥

引用来自“皮总”的评论

宏哥不急,一定能搞定。
Ok, Many thanks.
0
乌龟壳
乌龟壳

第一次用if测试的时候没有加上默认的index.html,直接就重定向到index.php了。

多判断一次加上index.html有没有文件再重定向到index.php咯

0
宏哥
宏哥

引用来自“皮总”的评论

宏哥不急,一定能搞定。

已经搞定了, 问题在于前面的配置中, nginx不保证 root指令在 set 指令之后执行

我通过一个正则将变量设置后就ok了, 

前面那个root的设置, 在 文件不存在的时候, root会被计算为 /var/www/sites///www

就是$2,$3值为空。

  

server {
	listen   80 default;
	server_tokens off;
#without = , there is no possible to change reponse code in PHP
	error_page  403 =  /index.php;

	charset utf-8;
	server_name ~^(?:(?<sub_parse>.*)\.)?(?<domain>.*)\.(?<domain_type>.*)$;
	set $sub 'www';	
	if ($sub_parse){
		set $sub $sub_parse;
	}

	if ($sub_parse !~ (\w+)){
		rewrite (.*) http://$sub.$domain.$domain_type$request_uri permanent;
	}

	access_log  /var/log/nginx/$sub.$domain.$domain_type.access.log;
	root   /var/www/sites/$domain_type/$domain/$sub_parse;
	gzip  off;
	gzip_static on;
	index  index.html;


	location /favicon.ico {
		root  /var/www/default;
	}

	location /{
		if (!-e $request_filename){
			rewrite ^/(.*)$ /index.php;
		}

		if (-e $request_filename){
			expires modified +7d; 
		}

		location ~ \.php$ {
			fastcgi_pass   unix:/var/run/fpm.sock;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME  /webserver/dep/run/ccd/index.php;
			include        /etc/nginx/fastcgi_params;
		}
	}

	#error_page  404  /404.html;

	# redirect server error pages to the static page /50x.html
	#
	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   /var/www/default;
	}
}



返回顶部
顶部