在第二个相同情况下,nginx 正在下载 php 文件

在第二个相同情况下,nginx 正在下载 php 文件
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/ /site2locations alias,然后就会try_files尝试提供文件。如果找不到文件,请求就会传递给 PHP 处理块。

在PHP处理块中,我们用来$document_root传递alias位于location块中的目录规范。

因此我们只需要一个 PHP 块,这样就应该可以避免您遇到的问题。

在替代的单块location示例中,我使用正则表达式将引用的站点编号捕获到变量中,然后将该变量用于指令alias。这进一步消除了不必要的重复。

相关内容