前几天记录了一篇《AMP表单Post方式提交后不能跳转的问题及解决办法》,找到了原因,修改了Drupal网站,那么MediaWiki网站中也可以使用类似办法来解决,今天花了一些时间来试验,下面把结果记录下来:
- 首先还是需要把普通表单替换为符合AMP-Form的格式,特别是Post到的网址需要是action-xhr,这一步我们先已经实现了,办法是在skins/AMP/AMPTemplate.php中加入过滤替换的函数,这里不详细写了;
- 这个时候使用表单Post提交功能,例如:编辑Test页面留言,在Web端都正常,而在AMP端,可以编辑保存成功,但缺少了一个跳转环节,让用户误以为没有提交成功;
- 在includes/OutputPage.php中找到了public function output函数里面有header( 'Location: ' . $redirect )语句明显是与Drupal中一样的跳转功能,修改这个地方,加入是否amp网站的判断,如果是amp网站使用另外的办法来实现跳转:
if ( Hooks::run( "BeforePageRedirect", [ $this, &$redirect, &$code ] ) ) { if ( $code == '301' || $code == '303' ) { if ( !$config->get( 'DebugRedirects' ) ) { $response->statusHeader( $code ); } $this->mLastModified = wfTimestamp( TS_RFC2822 ); } if ( $config->get( 'VaryOnXFP' ) ) { $this->addVaryHeader( 'X-Forwarded-Proto' ); } $this->sendCacheControl(); $response->header( "Content-Type: text/html; charset=utf-8" ); if ( $config->get( 'DebugRedirects' ) ) { $url = htmlspecialchars( $redirect ); print "<html>\n<head>\n<title>Redirect</title>\n</head>\n<body>\n"; print "<p>Location: <a href=\"$url\">$url</a></p>\n"; print "</body>\n</html>\n"; } else { //jamesqi 2017-9-22 //add start $url = htmlspecialchars( $redirect );//同事发现首页跳转有问题,增加此行 $server_name = $_SERVER['SERVER_NAME']; if (strpos($server_name,'amp.') !== FALSE) { header("AMP-Access-Control-Allow-Source-Origin: https://$server_name"); header("AMP-Redirect-To: $redirect"); header("Access-Control-Expose-Headers: AMP-Redirect-To, AMP-Access-Control-Allow-Source-Origin,Access-Control-Allow-Origin"); header("location: $url");//同事发现首页跳转有问题,增加此行 print json_encode(array("")); die(); } //add end $response->header( 'Location: ' . $redirect ); } }
实际使用中很正常,可以现实与Web页面一样的功能和跳转。而百度MIP允许与普通Web页面一样的header
( 'Location: ' . $redirect )语句来跳转,而且我们Wiki站采用了子域名方式做MIP站点,后面跟着的URI是一样的,就无需做任何修改。
评论