Nginx位置:403错误/找不到文件

时间:2014-11-07 22:22:07

标签: nginx directory http-status-code-403 file-not-found

我使用nginx在我的服务器上设置了域名。到目前为止我的主页工作得很好。但现在我想添加一些位置以便以后测试编程。我的计划是调用不同的项目,如mydomain.com/php/myprogramm.php

所以我在 /var/www/mydomain.com/php 中添加了一些文件夹(我的索引位于 /var/www/mydomain.com / HTML

输入 www.mydomain.com/php / 会导致 403错误 mydomain.com/php/myprogramm.php 会导致< strong>找不到文件 ...

这是我的nginx文件:

server {
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

# Make site accessible from http://localhost/
server_name mydomain.com www.mydomain.com;

location / {
    root /var/www/mydomain.com/html;
    index index.html index.htm;
}

location /php/ {
    root /var/www/mydomain.com;
}

location /js/ {
    root /var/www/mydomain.com;
}

location /node/ {
    root /var/www/mydomain.com;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
#   # With php5-cgi alone:
#   fastcgi_pass 127.0.0.1:9000;
#   # With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

}

当然,当我设置我的域名时,我还设置了 sudo chown -R www-data:www-data /var/www/mydomain.com/html sudo chmod 755 /无功/网络

某些想法有人吗? :/

2 个答案:

答案 0 :(得分:0)

问题分析

第一条黄金法则是:

nginx始终只接受来自 location的请求。(重新)阅读http://nginx.org/en/docs/http/request_processing.html

根据您的配置:

  1. (www.)mydomain.com/php/<whatever>的{​​{1}}来自.php的{​​{1}}将向location /php/提供/var/www/mydomain.com/php/<whatever>提交的文件请求(www.)mydomain.com/<whatever>.php
  2. 来自location ~\.php$
  3. <default root ('html' by default)>/<whatever>.php将向.php提出请求

    这里的第一个问题是您没有从您认为自己的位置提供/var/www/mydomain.com/php/个文件。从location文档中了解如何选择服务请求的位置块。

    您会注意到“找不到文件”&#39;错误不是nginx错误,而是由PHP生成的消息。这有助于了解问题是来自(前端还是后端)。

    现在关于403:似乎nginx无法访问应该从中提供内容的位置。检查location(目录+内容)权限。

    提议的建议

    您的配置看起来不够理想。

    1. 如果您在许多root /var/www/mydomain.com; location / { root /var/www/mydomain.com/html; index index.html index.htm; } location /php/ { location ~ \.php$ { # Useless without use of $fastcgi_script_name and $fastcgi_path_info # Moreover, requests ending up here always end with .php... fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; # You seem to have copy-pasted this section without understanding it. # Good understanding of what happens here is mandatory for security. } } 块中使用相同的根,为什么不将它移动一层以上,以便它成为默认值(您可以在需要的特定位置覆盖它?)
    2. 您可以使用嵌套位置,即解决PHP文件服务问题。请注意,在前缀位置中包含正则表达式位置是始终一个好主意(有什么区别?阅读location文档)。原因是正则表达式位置对顺序敏感,这对维护很不利。前缀位置不是因为只选择与请求URI最长的匹配。
    3. 以下是部分配置的推荐更新版本:

      {{1}}

      我建议您阅读有关fastcgi_split_path_info$fastcgi_script_name$fastcgi_path_info的文档。

答案 1 :(得分:0)

对于我现在的测试,我很简单地解决了这个问题。

  1. 我forogt检查我的php.ini并将cgi.fix_pathinfo更改为0
  2. 我还将我的文件夹组(仍然有root内容)更改为www-data。
  3. 最后我更新了我的配置:我设置root /var/www/mydomain.com;在我的服务器块(服务器{})
  4. 这就是我所做的一切。

    但是我会在以后的问题上记住你的建议。

    感谢您的帮助,我很感激。