phalcon 访问IndexController 中只能访问indexAction方法,访问不了testAction

phalcon 访问IndexController 中只能访问indexAction方法,访问不了testAction
但是可以访问ArticleController里面的任意方法
看说是Apache 的rewrite问题

但是我的.htaccess文件都是按照文档里面的。

两个.htaccess

第一个

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule  ^$ public/    [L]
<span">RewriteRule  ((?s).*) public/$1 [L] 
</IfModule>

public目录下面的.htaccess中

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] 
</IfModule>

访问路由 localhost/index/test访问不到,但是localhost/index.php?_url=/index/test可以访问得到

解决方法:

直接打印 $_request,发现当路径为 localhost/index/test 的时候,没有_url参数,判断是url重新没成功。将 RewriteCond %{REQUEST_FILENAME} !-f 这行去掉,发现_url 的值是 index.php/test

也就是说apache没有将index/test 看成一个整体,分开请求了,先请求index再请求test,当index不存在时,直接去找index.php,index.html,此时index匹配成功重写取消,而index下的test没有匹配成功,重写后就成了index.php/test了。那么apache为什么不是把index/test看成一个整体,而是分开去处理呢?

怀疑是因为httpd.conf中打开了允许列出目录的功能 mod_autoindex;并设置了Options Indexes允许目录浏览,受目录浏览影响导致重写问题,

取消掉Options 的其他参数,仅保留FollowSymLinks参数,重启apache后,index/test 可以正常访问了

难道真是目录浏览功能的问题?

Options +Indexes +Includes +FollowSymLinks +MultiViews

配置中一共有四个参数,挨个试,最后发现是受MultiViews参数影响。。。但是具体为什么就不清楚了,

ps:出现该问题的工具是wampserver 3.0.6 64bit 版本,32bit版本的没出现该问题,老版的apache也没出过现该问题,猜测可能是apache版本升级进行了什么调整导致的,具体原因再论。

2018-11-28 更新
今天看到一篇文章,标题为: apache的MultiViews的问题

文章来源:https://blog.csdn.net/u014359108/article/details/70859651

该博文介绍了:

MultiViews的作用是当访问到目录中不存在的对象时,
如访问”http://localhost/test/target”,
则apache会寻找该目录下的所有target.*文件.
如果test目录下存在target.jpg文件,
则会把这个文件返回给客户,
而不是返回出错信息.
再分析一下我们现在面对的实例.由于MultiViews的特性,
当访问“http://servername/Index/index”时.
由于根目录下存在index.php文件
所以上面的访问会变成这样:
“http://servername/Index.php/index”

到这里,就清楚为什么httpd.conf中有MultiViews 配置是

Options +FollowSymLinks +MultiViews

phalcon 访问indexController 的方法是就只能访问indexAction()了

mysql解决only_full_group_by

mysql解决only_full_group_by

下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了。

一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了

only_full_group_by 模式开启比较好。

因为在 mysql 中有一个函数: any_value(field) 允许,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

 

具体出错提示:

[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

1、查看sql_mode

01
select @@global.sql_mode;

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

01
set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

1
set
sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

 

解决办法大致有两种:

一:在sql查询语句中不需要group by的字段上使用any_value()函数

这种对于已经开发了不少功能的项目不太合适,毕竟要把原来的sql都给修改一遍

二:修改my.cnf(windows下是my.ini)配置文件,删掉only_full_group_by这一项

若我们项目的mysql安装在ubuntu上面,找到这个文件打开一看,里面并没有sql_mode这一配置项,想删都没得删。

当然,还有别的办法,打开mysql命令行,执行命令

1
select @@sql_mode;

这样就可以查出sql_mode的值,复制这个值,在my.cnf中添加配置项(把查询到的值删掉only_full_group_by这个选项,其他的都复制过去):

1
sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

如果 [mysqld] 这行被注释掉的话记得要打开注释。然后重重启mysql服务

注:使用命令

1
set sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

这样可以修改一个会话中的配置项,在其他会话中是不生效的。

微信invalid signature处理

微信js_sdk, invalid signature 错误,问题原来出在这里了。。。

微信分享功能,测试没问题,放到线上后一直报错,config:invalid signature,签名校验工具生成的和后台生成的一样,网上说的各种方法都实验了一遍,正式线上环境依然报错。

偶尔灵光一闪,发现了问题所在:

因为先用的测试环境,前端的appid就用的测试号的appid,上传到正式环境后,服务器上正式环境的appid是正式的appid,但是前端的没有改,后端sign生成没问题,拿后端的参数校验也没问题,唯独appid,因为是写死在前端的,没有改,所以到线上后,就报错了。。。。

还是自己不够细心,在此记录下,也希望为能为遇到同样问题的您,提供一个解决问题的线索。。