秦始皇二一四
停止思考是一种堕落

WordPress的内外网同时访问与多媒体绝对路径解决方案

WordPress设计是根据绝对路径设计的,其对于站点地址有2个参数,分别是WP_HOME和WP_SITEURL。然而如果说将站点搭建在本地的话,默认会以,形如:http://127.0.0.1
的形式进行,显而易见,在当让外网用户查阅时,会发生问题:那就是除了首页以外,其他都将被指向内网,这将严重影响访客情绪,网上很多资料是显示,可以前往数据库的wp_options把WP_HOME和WP_SITEURL的数据去除地址,改为相对地址,例如:/ 或 /cms/ 或 /blog/等等,而非类似:http://127.0.0.1/ 或 http://127.0.0.1/blog/
然而,这个改动存在一个隐藏的问题,比如我并非是无端口号的访问,若80端口占用,我配置Apache为81端口后,访问地址会变为形如:http://127.0.0.1:81
这样的,但是因为其内部机制问题,会丢弃掉端口号,而导致内网无法访问(虽然外网访问是一切正常的),这个现象仅限前台(可能仅限首页),后台管理等还是可以进入的,但是还是给自己和别人带来不便,在查阅了大量资料后,我找到了一份资料,即可以实现内外网都完美显示且不需要修改数据库的2个字段(保持默认即可)。这个方法非常简单,就是声明2个常量,在Wordpress安装目录下,在安装后会生成一个wp-config.php文件,在这个配置文件里的顶部增加如下代码:

//内外网同时访问设定(自动匹配)
$home = 'http://'.$_SERVER['HTTP_HOST'].'/cms';
$siteurl = 'http://'.$_SERVER['HTTP_HOST'].'/cms';
define('WP_HOME', $home);
define('WP_SITEURL', $siteurl);

上面是范例,而非真的要放在cms文件夹下,这里参照我的网站的写法。我们可以看到使用了PHP自带的命令即可,也就是获取当前用户访问的具体地址生成的常量用来声明现在的绝对路径,即实现了内外网同时访问或域名各种变更导致的问题。

有关于上传的媒体默认包含绝对路径的问题,可以类似如下解决,需要在wp-include/post.php修改wp_get_attachment_url函数,使其插入的图片变更为相对路径(去除了http://domain.com/)即可,如下为代码示例(将原来的相同内容注释掉):

以下内容在3.9~4.0下测试通过。

function wp_get_attachment_url( $post_id = 0 ) {
$file_dir=dirname(__FILE__);
$server_root=$_SERVER[DOCUMENT_ROOT];
$file_dir=substr($file_dir,strlen($server_root));
$file_dir=substr($file_dir,0,-12);
if($file_dir!=''){
$file_dir='/'.substr($file_dir,1);
}

$post_id = (int) $post_id;
if ( !$post =& get_post( $post_id ) )
return false;

$url = '';
if ( $file = get_post_meta( $post->ID, '_wp_attached_file', true) ) { //Get attached file
if ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) { //Get upload directory
if ( 0 === strpos($file, $uploads['basedir']) ) //Check that the upload base exists in the file location
//$url = str_replace($uploads['basedir'], $uploads['baseurl'], $file); //replace file location with url location
$url=$file_dir."/wp-content/uploads/".$file;
elseif ( false !== strpos($file, 'wp-content/uploads') )
//$url = $uploads['baseurl'] . substr( $file, strpos($file, 'wp-content/uploads') + 18 );
$url=$file_dir."/wp-content/uploads/".$file;
else
//$url = $uploads['baseurl'] . "/$file"; //Its a newly uploaded file, therefor $file is relative to the basedir.
$url=$file_dir."/wp-content/uploads/".$file;
}
}
if ( empty($url) ) //If any of the above options failed, Fallback on the GUID as used pre-2.7, not recomended to rely upon this.
$url = get_the_guid( $post->ID );
if ( 'attachment' != $post->post_type || empty($url) )
return false;
return apply_filters( 'wp_get_attachment_url', $url, $post->ID );
}

通过以上操作后,上传的媒体将不再包含绝对路径而是采用相对路径了,方便迁移以及内外网的同时访问问题。

 

本文参考:

http://blog.sina.com.cn/s/blog_ba532aea0101bb1a.html
http://yuanxi.blog.51cto.com/2149074/980913/

 

秦始皇二一四

一个纯自学的伪技术宅,对于互联网、网络游戏以及相关交叉领域充满持续性的兴趣,对于编程、网页开发有极大兴趣,自学并主动实践了以PHP+mysql为载体的网站开发,并持续学习、完善中。 有关网站相关的更多信息请点击这里

赞(0) 打赏
版权声明:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议(CC BY-NC-SA 4.0) 进行授权
文章名称:《WordPress的内外网同时访问与多媒体绝对路径解决方案》
文章链接:https://www.qyh.name/161/wordpress%e5%86%85%e5%a4%96%e7%bd%91%e5%90%8c%e6%97%b6%e8%ae%bf%e9%97%ae%e4%b8%8e%e5%a4%9a%e5%aa%92%e4%bd%93%e7%bb%9d%e5%af%b9%e8%b7%af%e5%be%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

觉得文章有用就打赏一下

非常感谢你的打赏,我们将继续努力提供更多优质内容,让我们一起创建更加美好的网络世界!(注意:私密文章打赏不代表可以获得查看权限)

支付宝扫一扫

微信扫一扫