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/