Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 子url yii框架的Nginx重定向404_Php_Redirect_Yii_Nginx_Http Status Code 404 - Fatal编程技术网

Php 子url yii框架的Nginx重定向404

Php 子url yii框架的Nginx重定向404,php,redirect,yii,nginx,http-status-code-404,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.ph

我正在尝试使用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

如何进一步调整此配置,以便只重定向子url上出现的404及其下线,并使用301例如/news//和/items/*,同时保持其他404不变

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

/news/
/items/
要保留404作为其余部分,例如:

/
/posts
/images
/videos
更新:我根据梅尔文的建议修改了配置。它现在重定向以/news和/items开头的所有请求,而不管是否为404。我正在使用Yii-PHP框架。上面提到的文件夹没有物理位置,它们只是Yii的路由


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

目前您在服务器级别设置了错误页面,但错误页面也在某个位置工作

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

不要害怕重复自己的话,使用nginx比使用复杂的正则表达式更可取

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

最后,由于目标是静态的,您可以使用:

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

找到了解决此问题的方法。不确定这是否是一个好的实践,但如果您使用的是执行内部重定向的PHP框架,那么肯定值得一试

我添加了一个“if”语句,用于检查$request\u uri变量中我想要自定义404的变量

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默认错误处理程序处理。

我删除了服务器范围的错误页面,并添加了位置~^/news | items/?{错误\第404页=301@redirect;}。它现在似乎可以重定向所有内容,而不管它是否是404。