Nginx重定向404为子url yii框架

时间:2014-09-17 02:43:23

标签: php redirect yii nginx http-status-code-404

我正在尝试使用nginx中的以下配置将404页面重定向到我的主站点:

server {

    listen   80; 

    server_name localhost;
    root /var/www/mysite;

    include /etc/nginx/rewrite/*.conf;

    fastcgi_intercept_errors on;

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

    location ~ ^/(news|items)/? {
            error_page      404     =301 @redirect;
    }

    location @redirect {
            rewrite .* / permanent;
    }

    location ~ \.php$ {
            fastcgi_pass   unix:/tmp/php5-fpm.socket;
            fastcgi_index  index.php;
            include fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO        $fastcgi_path_info;
    }

}

与此配置一样,所有404页面都被重定向到/ site。

如何进一步调整此配置,以便我只重定向发生在子网址上的404以及它们的下行线路301(例如/ news / / < / strong>和/ items / * )同时保持其他404完好无损?

进一步说明: 要使用301重定向404,请执行以下操作:

/news/
/items/

其余为404,

/
/posts
/images
/videos

更新:我已根据梅尔文的推荐修改了配置。它现在重定向以/ news和/ items开头的所有请求,无论是否为404。我正在使用Yii PHP Framework。上面提到的文件夹没有物理位置,它们只是Yii的路径。

更新2:找到解决方案。看看下面的答案。

2 个答案:

答案 0 :(得分:0)

目前,您在服务器级别设置了错误页面,但error_page也适用于某个位置。

因此,对于要覆盖默认行为的任何位置,只需添加一个位置并重新提供error_page。

不要害怕重复自己,nginx优于复杂的正则表达式。

在您的情况下,您希望默认行为不同,因此只需从服务器级别删除该error_page,并将其设置在/ news /和/ items /。

最后,由于目的地是静态的,你可以使用:

error_page 404 =301 $scheme://$host/;

答案 1 :(得分:0)

为此找到了解决方法。不确定这是否是一个好的做法,但如果您使用的是进行内部重定向的PHP框架,那么当然值得一试。

我添加了一个'if'语句,用于检查我想要自定义404的$ request_uri变量

location ~ \.php$ {
        fastcgi_pass   unix:/tmp/php5-fpm.socket;
        fastcgi_index  index.php;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        if ($request_uri ~ ^/(news|items) {
            error_page      404     =301 @redirect;
        }
}

当然删除了以下块

location ~ ^/(news|items)/? {
        error_page      404     =301 @redirect;
}

这样,我可以在/ news /和/ items /下重定向所有404,而其他404由PHP默认错误处理程序处理。