TP5路由规则无效,访问任意地址皆为网站首页的解决方案

今天碰到一个有意思的事情,因为公司域名备案注销,导致网站无法访问,备案需要10-20个工作日,但这几天有急用必须能够保证正常访问,所以只好暂时找一个免备案的主机,并将网站迁移过去让其正常访问。

正好我的短网址服务器支持解析香港线路,于是想到把两边的程序交换一下,自己的短网址使用公司的服务器(因为自己的ex666.cn这个域名是已经备案了的),公司的网站程序使用我个人的短网址服务器。

一切工作正常展开并且非常顺利,但是把自己的短网址上传完成之后,发现功能无法正常使用,打开任意链接全部都是访问的首页,本想着仔细排查,但是公司人员因为需要急用电话问我相关进度,于是暂时放下去吧公司的网站上传过去并解析到服务器。

公司那边网站上传过去再将域名解析一遍,一路上还是非常顺利,所以搞定了就吃饭去了。

晚上回来又继续折腾自己短网址这边的问题,因为第一次遇到,所以花了一点时间,搜索了一下相关的问题却并没有找到解决方案,只找到一个和我遇到相同问题的开发者在TP官方社区提问,但并没有得到解决。

一切还得靠自己,大概排查了一下代码、路由器定义以及配置项,并没有发现有什么端倪,毕竟在原主机上好好的,文件也是照抄不误直接迁移过来到新的服务器上,因此问题只能大致确认在服务器不同,一些细节上的功能支持也不同。

仔细看看官方给出的URL重写规则如下:

1
2
3
4
5
6
7
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

用的PATHINFO解析,所以猜测可能是新的服务器对PATHINFO的支持有关,官方配置项给出了PATHINFO的变量名配置项,用于兼容模式,所以我首先在地址栏尝试了 index.php?s=xxx,没想到就可以正常访问了,因此将.htaccess中的规则稍微修改如下:

1
2
3
4
5
6
7
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>

再次尝试,问题完美解决~

所以这次的问题应该就是出在服务器对PATHINFO的兼容问题上,将重定向规则稍微修改一下改为兼容模式就可以完美解决了。

记得在TP3的时候,URL模式是直接提供几种固定的方式,其中兼容模式以及PATHINFO两种模式就在其中。

TP5相对来说更加灵活一些,相对于TP3固定只能选择一种,TP5可以说是两种模式共存了吧。