使用 Nginx 使用 try_files 将所有对不存在文件的请求重写为 index.php

Posted

技术标签:

【中文标题】使用 Nginx 使用 try_files 将所有对不存在文件的请求重写为 index.php【英文标题】:Rewrite all requests for non existing files to index.php with try_files with Nginx 【发布时间】:2014-01-03 07:31:47 【问题描述】:

我正在尝试将琐碎的 htaccess 文件转换为 nginx,但无法使其工作。它返回 404 错误。 这是htaccess的内容:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php [L]

这是我当前的 nginx 配置:

server 
listen 80;
server_name domain.biz;
root /var/www/domain.biz;
charset utf-8;
autoindex off;

location / 
try_files $uri $uri/ /index.php?$args;


location ~ \.php$ 
include        fastcgi_params;
fastcgi_pass   unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME /var/www/domain.biz$fastcgi_script_name;


【问题讨论】:

【参考方案1】:

    你直接调用的其他php文件怎么样?例如只有一个

    的 info.php

    phpinfo();

    里面?

    我问这个是因为你的服务器配置文件似乎使用 try_files 恰到好处,但我不确定你是否正确地提供 php 脚本。

    ¿你的 fastcgi 池是否在监听那只袜子? ¿ 例如,您确定它没有在端口 9000 中侦听吗?无论如何,我更喜欢在 http 部分定义一个上游,稍后在服务器部分使用它

    http 
    
        upstream phpbackend 
            server unix:/var/run/php5-fpm.sock;
        
        ...
    
    
        server 
            ...
            location ~ \.php$ 
                include       fastcgi_params;
                fastcgi_pass  phpbackend;
                fastcgi_param SCRIPT_FILENAME /var/www/domain.biz$fastcgi_script_name;
                
        
    
    

    您确定您的 php.ini 将 cgi.fix_pathinfo 设置为 false 吗?

【讨论】:

谢谢,在你的回答之后,我重新启动了 nginx,现在它工作正常 :) 似乎重新加载还不够

以上是关于使用 Nginx 使用 try_files 将所有对不存在文件的请求重写为 index.php的主要内容,如果未能解决你的问题,请参考以下文章

Web架构之Nginx try_files

Nginx之try_files指令

Nginx使用try_files返回500错误的解决方案

Nginx学习笔记05错误页面重定向

将 Nginx 重写从“if”转换为“try_files”

从 nginx try_files 中排除文件夹