这里的问题是网址中的加密代码,
我的网址是这样,加密代码就在最后:
http://localhost/php_pro_106/reload/ByCustomer/mJYwIzoaIGe0R8lAVCqPhG%2Fg0jJFWjiWWdPnkq5VDlY%3D
在main.php网址设置中:
'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName' => false,
'caseSensitive'=>false,
'rules'=>array(
'giftcard/<id:\w+>'=>'giftcard/index',
'reload/ByCustomer/<giftcode:\w+>'=>'reload/ByCustomer',
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\w+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
我的行动是重装控制器:
public function actionByCustomer()
{
echo "test";
print_r($_GET);
}
我得到了:
The requested URL /localhost/reload/ByCustomer/mJYwIzoaIGe0R8lAVCqPhG/g0jJFWjiWWdPnkq5VDlY= was
not found on this server.
实际上问题在于ByCustomer/mJYwIzoaIGe0R8lAVCqPhG%2Fg0jJFWjiWWdPnkq5VDlY%3D
,因为它是加密的。我应该怎样做才能使它工作?
答案 0 :(得分:2)
在你的byCustomer规则中,礼物代码正则表达式匹配单词。但是那个uri部分mJYwIzoaIGe0R8lAVCqPhG%2Fg0jJFWjiWWdPnkq5VDlY%3D
不是一个单词,因为它包含像%这样的字符。它看起来像是一个url编码的字符串,%2f是/
而%3d是=
。然而,所有这些都不是一句话。
尝试此规则:
'reload/ByCustomer/<giftcode:.+>'=>'reload/ByCustomer',
匹配reload/ByCustomer/
之后的任何符合您目的的字符。
答案 1 :(得分:0)
我得到了它的解决方案,为此我必须改变我的编码和解码方法:
问题是由于编码的Url中存在一些字符。所以,我必须替换这些字符。
在main.php中,Url Manager会像:
'reload/ByCustomer/<giftcode>'=>'reload/ByCustomer',
apache在URL中有%2F的问题,它总是以404回复,不会执行php脚本。
编辑:
这是一个解决方案,但它要求您至少可以编辑虚拟主机的apache配置文件(当时我没有这样做)。然后,您必须在AllowEncodedSlashes On
内添加<VirtualHost>
。或者您也可以在全球范围内进行设置。
如果您不想这样做。
这些链接帮助我: