nginx try_files和索引未按预期执行

时间:2013-11-26 19:56:43

标签: file nginx

location /social {
  index index.php;
  try_files $uri /social/index.php;
}

当用户点击目录时,需要运行本地./index.php 到目前为止,当人们出现/社交/它运行index.php 当用户访问所有未知网址时,他们会获得/social/index.php

但是,当用户访问/ social / subdir /并且存在/social/subdir/index.php时,它仍会运行/social/index.php。我需要它来运行/social/subdir/index.php

如果我将配置更改为:

location /social {
  index index.php;
  try_files $uri $uri/index.php /social/index.php;
}

然后nginx将social / subdir / index.php的内容提供为content-type:octet / stream。

我认为index index.php会查找路径索引文件。

php渲染块:

location ~ .php$ { ## Execute PHP scripts
    if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

    expires        off; ## Do not cache dynamic content        
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        /etc/nginx/fastcgi_params;
}

2 个答案:

答案 0 :(得分:1)

首先从try_files指令中删除index.php,使其看起来像这样

location /social {
  index index.php;
  try_files $uri $uri/ /social/index.php =404;
}

还要确保没有其他位置块捕获/ social / subdir / request。

最后(与您的问题无关,但非常重要)删除此行

if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

这完全是多余和邪恶的。 try_files不会错过404。有关详细信息IfIsEvil

,请查看此信息

答案 1 :(得分:1)

我认为您的主要问题是您没有在http://之前使用127.0.0.1:9000,还要确保您的php使用端口9000而不是sock文件,否则您更改了fastcgi_pass unix socket。

这是我的简化配置。

如果index index.php块中的/social块中的server块相同,则从location /social { # index index.php; # remove if not needed try_files $uri $uri/ /social/index.php; } location ~* \.php$ { include fastcgi_params; fastcgi_pass http://127.0.0.1:9000; } 块移除{。}}。

{{1}}