server {
listen 80;
server_name example.com;
root /srv/www/example.com;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
location / {
index index.html index.php;
}
location /site1 {
try_files $uri $uri/ /index.php;
index index.php index.html;
root /srv/www/example.com;
}
#Pass the PHP scripts to FastCGI server
location ~ /site1/.+\.php$ {
set $php_root /srv/www/example.com;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name;
include fastcgi_params;
}
location /site2 {
try_files $uri $uri/ /index.php;
index index.php index.html;
root /srv/www/example.com;
}
#Pass the PHP scripts to FastCGI server
location ~ /site2/.+\.php$ {
set $php_root /srv/www/example.com;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $php_root$fastcgi_script_name;
include fastcgi_params;
}
}
当用户访问域名http://example.com时,文件http://example.com/index.html会呈现在他的浏览器中(文件路径:/srv/www/example.com/index.html)。
当用户访问域名 http://example.com/site1 时,文件http://example.com/site1/index.php在他的浏览器中呈现(文件路径:/srv/www/example.com/site1/index.php)。
但是当用户访问域名 http://example.com/site2 时,文件http://example.com/site2/index.php已下载(文件路径:/srv/www/example.com/site2/index.php)。
site1 和 site2 的配置相同。为什么一个能用,一个不能用?我做错了什么?
答案1
事实上你做错了很多事情:)
第一个问题是您在块root
内使用了重复的指令。然后您在不需要变量时location
使用了变量。$php_root
一个小问题是,您正在将日志写入可公开访问的目录(在文档根目录下)。
这是一个简化的配置,可以完成您要做的事情:
server {
listen 80;
server_name example.com;
root /srv/www/example.com;
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
index index.html index.php;
location /site1/ {
alias /srv/www/example.com/site1/;
try_files $uri $uri/ /index.php;
}
location /site2/ {
alias /srv/www/example.com/site2/;
try_files $uri $uri/ /index.php;
}
# Alternative solution to the above two location blocks
# location ~ /site(?<sitenr>[1-2])/ {
# alias /srv/www/example.com/site$sitenr/;
# }
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
这里,我们只需使用指令声明/site1
/ /site2
locations alias
,然后就会try_files
尝试提供文件。如果找不到文件,请求就会传递给 PHP 处理块。
在PHP处理块中,我们用来$document_root
传递alias
位于location
块中的目录规范。
因此我们只需要一个 PHP 块,这样就应该可以避免您遇到的问题。
在替代的单块location
示例中,我使用正则表达式将引用的站点编号捕获到变量中,然后将该变量用于指令alias
。这进一步消除了不必要的重复。