因为伪静态而导致的nginx_status,php_status访问404的问题

因为伪静态而导致的nginx_status,php_status访问404的问题

摘要:

有时候为了优化访问网站的SEO常常给web服务器配置伪静态(一些rewrite规则),但是伪静态是把双刃剑,如果对rewrite规则和用法掌握不熟练,就会影响一些访问的功能,如访问某些页面404,玩过wordpress的人都知道,有时候从apache迁移至nginx 时就会出现404的问题,一般处理方法就是在网站根目录建立.htaccess文件并在里面加一些rewrite规则实现跳转。今天解决的问题是来自于我的一个小伙伴。他需要通过监控商城系统的nginx和php情况,进而需要在nginx 配置文件中配置nginx_status  和php_status实现(nginx和php提供的一个模块的功能,开启并配置后可以得到nginx或者php的一些状态数值,从而实现监控。)但是配置以后访问却出现404情况。下面我们开始分析整个过程。

描述:

我直接将小伙伴配置文件的伪静态规则拷贝到我站点上。发现当rewrite规则写在server字段中,导致我的博客里写的文章全部404,并且如上图所示我的php_status nginx_status也是404

原配置文件截图:

第一分析阶段:

  • 最初我是没把问题定位到这里,我在想是不是他定义了什么不恰当的安全规则而导致返会了404 (有404规则,但是针对的是访问public data等网站数据目录,排除!)
  • nginx_status 和php_status 本身是不存在网站目录以内的,如果没配置nginx php 这两个模块功能,也会404(但是检查配置没问题 排除!)
  • 既然配置没问题,404还有什么原因呢?他真的按照我们的请求去处理了么?那就要检查rewrite规则了。rewrite可是魔术师。轻松改变你访问的url (观察配置文件,确实有rewrire规则.解读规则后发现果然是他的问题)

讲解:

if (!-e $request_filename) 

rewrite ^/(.*)$ /index.php/$1 last;

意思就是如果你访问的文件或者目录不存在。比如我访问https://wangtingwei.info/php_status就会重定向为 https://wangtingwei.info/index.php/php_status也就是说只要访问的域名后面有内容。都会自动补全index.php . 

所以会出现我的博客访问主页wangtingwei.info正常。但是一旦访问我的后台 wangtingwei.info/wp-admin/ 就会404  (因为自己在域名后自动补全了index.php,url变成wangtingwei.info/index.php/wp-admin);

第二阶段分析:

其实这个规则的写法大多数都是写进某个location 里 ,所以我也尝试把这个规则放在了 location /里面,结果确实可以访问到了(那是因为此时规则现在在location字段了,原来是server字段,是大范围,而且优先级高。现在改成location /里面,根据匹配优先级规则。location /是最后匹配的,所以我们的 php_status都可以访问到。)但是小伙伴说商城的管理界面打不开了发生了404。我的理解就是既然这个规则写到了server这么大范围,可能的原因就是代码本身和这个rewrite配置存在耦合关系。某些页面可能需要依赖这个server字段重定向才可以完成。也就是说这个方法虽然有效。但是影响了功能。继续想办法。

第三阶段分析:

前面我们分析了之所以访问404就是因为他在server 字段这个大范围里加入了rewrite导致访问一个不存在的php_status的目录时候在中间加了index.php 变成了

http://wangtingwei.info/index.php/php_status.  我们完全可以通过location ~/php_status 字段里再用rewrite 修改成我们要访问的资源.

解决:

location ~/php_status {
rewrite /index.php/php_status /php_status break; 

  • rewrite规则放在了location php_status中。让范围足够小。不影响其他请求。
  • 第二行的意思是 /代表我们的域名的那部分。/index.php/phps_status 就是wangtingwei.info/index.php/php_status 重写成  wangtingwei.info/php_status  break 是rewrite状态 表示不在继续任何rewrite的匹配了,
  • break 常用于小范围的location字段里,break 状态主要是防止被大范围的rewrite规则继续匹配rewrite。如果break  用于server字段里的rewrite状态,造成的后果就是某些location定义的rewrite规则失效。

结果:

可以正常获取到值

 

 

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...