我正在尝试使用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:找到解决方案。看看下面的答案。
答案 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默认错误处理程序处理。