“wordpress” 标签页面:

  • WordPress取消英文标点符号自动替换中文标点符号的优雅方法

    众所周知,WordPress中文版有个特性,会将每一处英文引号("")都稀里哗啦转化为中文引号(“”)。不仅仅是英文引号,在WordPress翻译文件定义了不少自动转换符号,具体可以参考这里

    对文字博客来说,这是个好功能,这样会避免用错英文标点。

    然而,WordPress是独立的php程序,中文社区中懂得使用者,大部分都是技术博客。而技术博客会经常贴出代码,里面包含各种英文标点是再正常不过的事情。这时候,英文标点符号自动转换就是一个恼人的画蛇添足功能了。

    网上很多文章都是让该WordPress核心文件。只不过,WordPress是一个高度模块化的系统,肯定有更优雅的解决方案。

    一番搜寻之后,发现最简单的办法,就是安装一个叫Quotmarks Replacer的插件,地址在这里

    插件很简单,就是将WordPress自动转换标点符号的函数用系统接口去掉。核心代码如下:

    <?php
    /*
    Plugin Name: Quotmarks Replacer
    Plugin URI: http://sparanoid.com/work/quotmarks-replacer/
    Description: Quotmarks Replacer disables wptexturize function that keeps all quotation marks and suspension points in half-width form.
    Version: 2.6.17
    Author: Tunghsiao Liu
    Author URI: http://sparanoid.com/
    Author Email: t@sparanoid.com
    License: GPLv2 or later

    Copyright 2016 Tunghsiao Liu, aka. Sparanoid (t@sparanoid.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */

    $qmr_work_tags = array(
    'the_title',             // http://codex.wordpress.org/Function_Reference/the_title
    'the_content',           // http://codex.wordpress.org/Function_Reference/the_content
    'the_excerpt',           // http://codex.wordpress.org/Function_Reference/the_excerpt
    // 'list_cats',          Deprecated. http://codex.wordpress.org/Function_Reference/list_cats
    'single_post_title',     // http://codex.wordpress.org/Function_Reference/single_post_title
    'comment_author',        // http://codex.wordpress.org/Function_Reference/comment_author
    'comment_text',          // http://codex.wordpress.org/Function_Reference/comment_text
    // 'link_name',          Deprecated.
    // 'link_notes',         Deprecated.
    'link_description',      // Deprecated, but still widely used.
    'bloginfo',              // http://codex.wordpress.org/Function_Reference/bloginfo
    'wp_title',              // http://codex.wordpress.org/Function_Reference/wp_title
    'term_description',      // http://codex.wordpress.org/Function_Reference/term_description
    'category_description',  // http://codex.wordpress.org/Function_Reference/category_description
    'widget_title',          // Used by all widgets in themes
    'widget_text'            // Used by all widgets in themes
    );

    foreach ( $qmr_work_tags as $qmr_work_tag ) {
    remove_filter ($qmr_work_tag, 'wptexturize');
    }

     

    2016.09.01 / 2 条评论 / 1,301 次点击 / 分类: 所谓技术

  • WordPress垃圾评论大作战

    自从把博客搬到独立服务器之后,垃圾评论有日益增长的趋势。

    上次集中清理垃圾评论的时间,刚好是6月初的一天。到8月下旬,居然积攒了5000多条垃圾评论!

    WordPress的用户应该都深有感触,这个博客程序还是挺招惹垃圾评论的。因此WordPress自带了一个叫Akismet的插件。

    Akismet插件工作原理是,将垃圾评论通过API上报到云端(想当年,Akismet诞生时云还不叫云,叫远程服务器),然后也会把垃圾评论存到垃圾评论数据库中。

    不过像我这样几个月收几千条垃圾评论的用户来说,存起来显然不是个好办法。那么,怎么解决呢?

    不急不急,解决之前,不如先分析一下问题吧!

    垃圾评论也分三六九等的,定义如下:

    1. 机器人瞎子一样直接向WordPress的评论接口发数据包
    2. 机器人先解析页面,然后构造请求
    3. 机器人解析页面,还模拟浏览器运行脚本,然后构造请求
    4. 人工手打垃圾评论

    分析了几千条垃圾评论,我觉得,像我这种小博客,99.99%都是第一、第二种情况。第三种几乎没有。第四种的话……也太看得起本站了。

    分析之后,豁然开朗,针对第一种的情况,其实只需要在页面加一些隐含的字段就可以了。不过现在的机器人似乎比较聪明,还是会看一下评论表单的隐藏字段。那么就用脚本再加另外一个隐含字段——只有运行脚本的浏览器,才能正确解析,也才能正确发送这一个由脚本填充的隐藏字段。

    但是,这种方案也有缺点,如果用户的浏览器不支持脚本,也就无法正确发送脚本填充的隐藏字段,同样会被拦截。关键在于,这样的用户有多少呢?

    这时候,大数据(误)就派上用场了。我看了一下来访用户统计,大部分都是chrome或chrome核心,其它移动端的用户也是智能设备。也就是说,感谢科技发展,大部分用户的浏览器都是支持脚本的。那么,这个措施还是可以实施的。

    于是乎,总结上面啰啰嗦嗦的一大串文字结论如下:

    1. 使用脚本在评论表单添加隐藏字段,发表评论时验证字段。
    2. 其余漏网之鱼,交给Akismet拦截。

    参考代码如下:

    <?php

    defined( 'ABSPATH' ) or die( 'No script kiddies please!' );

    define('DEFAULT_JQUERY_BEFORE', 'jQuery(function($) {');
    define('DEFAULT_JQUERY_AFTER', '});');

    function creke_cal_comment_val($k)
    {
    return strval(crc32('CrekeComment'.$k));
    }

    function creke_get_comment_form()
    {
    if(is_user_logged_in())
    {
    return;
    }

    $k = time(NULL);
    $v = creke_cal_comment_val($k);
    return "
    <input type='hidden' name='creke_comment_k' value='$k' />
    <input type='hidden' name='creke_comment_v' id='creke_comment_v' creke_comment_v='$v' value='$k'/>
    ";
    }

    function creke_get_comment_script($jQueryBefore=DEFAULT_JQUERY_BEFORE, $jQueryAfter=DEFAULT_JQUERY_AFTER)
    {
    if(is_user_logged_in())
    {
    return;
    }

    return "
    <script type='text/javascript'>
    $jQueryBefore
    var id='#creke_';
    id+='comment_v';
    $(id).val($(id).attr('creke_comment_v'));
    $jQueryAfter
    </script>
    ";
    }

    function creke_comment_form()
    {
    echo creke_get_comment_form();
    echo creke_get_comment_script();
    }

    add_action('comment_form', 'creke_comment_form');

    function creke_comment_check($commentdata)
    {
    $dieMsg = 'do not spam';
    $dieTitle = 'title';
    $isSpam = FALSE;

    $type = comment_type('comment', 'trackback', 'pingback');

    if(is_user_logged_in() || $type == 'pingback' || $type == 'trackback')
    {
    return $commentdata;
    }

    $k = $_POST['creke_comment_k'];
    $v = $_POST['creke_comment_v'];
    if((time(NULL) - $k) > 86400)
    {
    $isSpam = true;
    }
    if(!$isSpam)
    {
    $isSpam = (creke_cal_comment_val($k) != $v);
    }

    if($isSpam)
    {
    wp_die($dieMsg, $dieTitle);
    }

    return $commentdata;
    }

    if(!is_admin()) {
    add_filter('preprocess_comment', 'creke_comment_check', 1);
    }

    ?>

    2016.08.26 / 4 条评论 / 1,406 次点击 / 分类: 所谓技术

  • 博客装修之升级wordpress:从2.8.6到4.5.3

    博客很久没有更新了,不管是程序还是文章。博客程序用的是wordpress 2.8.6,那是2009年11月12日发布的,转眼间近7年了,想想还真是一段很长的时间啊。

    最近垃圾评论陡然增多,反垃圾插件太旧了跟不上时代,于是盘算着把长草的博客里里外外装修一番。

    就从博客程序先开始吧。

    参考文档:https://codex.wordpress.org/Upgrading_WordPress_-_Extended_Instructions,里面详细描述了如何升级wordpress,总的来说有以下几个要点:

    1. 备份数据库
    2. 备份当前所有wordpress文件,特别提醒别忘了.htaccess文件
    3. 验证上面两步的备份是可用的
    4. 停用所有插件
    5. 确保前面4步没问题
    6. 下载解压缩新版wordpress
    7. 从备份中拷出下列目录/文件,覆盖新版:wp-config.php、wp-content目录(除了wp-content/cache和wp-content/plugins/widgets目录)、wp-images(如果有的话)、wp-includes/languages/、.htaccess、robots.txt
      上传上面准备好的新文件
    8. 访问wordpress更新程序:你的博客/wp-admin/upgrade.php
    9. 检查.htaccess是否需要更新,一般不需要
    10. 更新插件到新版本
    11. 重新启用插件
    12. 更新wp-config.php的安全秘钥,就是AUTH_KEY那堆配置啦
    13. 再确认wordpress变更是否正常

    里面还有一章,叫“Upgrading Across Multiple Versions”即“跨版本升级”一节,其中提到:

    • wordpress向后兼容
    • 如果要跨好多版本升级,那么建议间隔一个版本来慢慢升级,例如:从2.5开始升级到4.5,那么先升级到2.7,再升级到2.9,再升级到3.1……以此类推
    • wordpress3.7之后有个一键升级(话说之前不是有吗?),支持从3.7直达4.5.3;不过,为了稳妥起见,我还是按照上面第2点的方法,跨版本慢慢升级

    按照wordpress的官方指引,再加上自己的小窍门,我的升级步骤如下。

    备份:

    1. 备份网站
    2. 备份数据库

    准备环境:

    1. 在本地启动Apache+PHP+MySQL环境,创建blog.creke.net的虚拟主机
    2. 更改blog.creke.net的host到127.0.0.1
    3. 恢复blog.creke.net网站和数据库到本地的虚拟主机
    4. 检查本地的环境真的真的没问题

    升级:

    1. 开始跨版本升级,每次都删除所有内容——解压新版——从备份中拷贝自定义内容——访问升级程序
    2. 看看后台是否正常,看看登入环境中前台是否正常,看看未登录环境中前台是否正常,注意用ctrl+F5刷新
      备份升级好的数据库,这个很重要,毕竟wordpress大量依赖数据库
    3. 从步骤1开始重复轮回,直到升级到最新版
    4. 升级了最后一个版本的时候,最后按照https://codex.wordpress.org/Editing_wp-config.php的文档,重新从wp-config-sample.php和旧的wp-config.php对照,编辑一个新的wp-config.php,保证设置的最新
    5. 更新必要的插件

    上线更新:

    1. 在网站上挂升级公告
    2. 查看第一步到现在有没有人留言,有的话注意增量备份留言
    3. 恢复文件和数据库
    4. 下线公告,恢复网站正常访问
    5. 稳定运行一段时间后,使用插件清理文章的草稿等数据

    于是乎,博客程序终于升级到了wordpress新版,旧的主题还能用,归功于wordpress向后兼容的设计哲学。

    当然主题也是要装修的,下次有时间继续吧。

    2016.08.25 / 暂无评论 / 828 次点击 / 分类: 所谓技术

  • Blogger转移到WordPress的rewrite跳转规则

    Blogger转移到Wordpress的.htaccess的rewrite跳转规则。

    这是很久之前写的,一直没有整理出来。刚好今天博客搬家,整理一下发上来。

    这份代码可以吧blogger的相同月份的文章转移到wordpress对应的月份归档里,当然,无论如何是不能从blogger的具体文章跳转到wordpress的对应文章的,这是是最精确、最有利于SEO的做法。

    以下是.htaccess的rewrite代码:

    #BEGIN old blog
    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      #post
      RewriteRule ^([0-9]{4})/([0-9]{2})/[A-Za-z0-9_-]+\.html$ /date/$1/$2 [R=301,L]
      #archive
      RewriteRule ^([0-9]{4})_([0-9]{2})_01_archive\.html$ /date/$1/$2 [R=301,L]
    </IfModule>
    #END old blog

    2010.12.12 / 2 条评论 / 773 次点击 / 分类: 所谓技术

  • Convert WordPress (P2) Microblog Database to StatusNet

    A few days ago , I tried to convert our WordPress blog , which was used to be our microblog with P2 theme , to StatusNet . StatusNet is a good microblog system , though it needs more developing .

    I wrote a PHP script to convert the WordPress database to StatusNet . There're posts and comments in WP that needs to be converted . Firstly , I said that I had no idea how to convert the replies . And I got a pretty answer "There is alway blood in every revolution" . But finally , I found a  way to convert .

    I had ONLY 2 users in WP , so it got a little simplier to do the converting job . If you have many users , you have to make a right users map about WP and SN , both in user IDs and reply "@"s .

    The "wp_posts" tables in WP needs to be converted , and the usernames in it is easy to convert . However , we need to convert "wp_comments" tables as replies into StatusNet , and the names has no relationship with WP users . So I wrote a function called "getID" to map the commenters in WP to user IDs in SN . And the "getID" function has another funtion , which is to map the WP user IDs to SN user IDs .

    I also import both WP db and SN db into one database to simplify the script .

    Here are the codes :

    <?php
    /*
    By Creke
    http://blog.creke.net
    */
    
    header('Content-Type: text/plain'); 
    
    function getID($i)
    {
    	if($i == 2 || strtolower($i) == 'user1')
    	{
    		return 4;
    	}
    	else if($i == 3 || strtolower($i) == 'user2')
    	{
    		return 3;
    	}
    	else
    	{
    		return 1;
    	}
    }
    
    	$mysql_a='dbhost';
    	$mysql_u='dbuser';
    	$mysql_p='dbpassword';
    	$mysql_n='dbname';
    	
    	set_time_limit(10); 
    
    		if($dblink = mysql_connect($mysql_a,$mysql_u,$mysql_p))
    		{
    			if(mysql_select_db($mysql_n))
    			{
    
    mysql_query("SET NAMES 'utf8'");
    mysql_query('TRUNCATE notice ;');
    mysql_query('TRUNCATE conversation ;');
    mysql_query('TRUNCATE reply ;');
    
    $oldID = 0;
    $newID = 1;
    $newConID = 1;
    
    //$SQL = "";
    //$result = "";
    //$myres = 
    
    for($i=0;$i<=505;$i++)
    	{
    		//post
    		
    		$oldID = $i;
    		$SQL = 'SELECT * FROM wp_posts WHERE post_type = \'post\' AND ID = '.$oldID;
    		if (!$result = mysql_query($SQL)){ 
    						echo "Execution ERROR :".mysql_error()." "; 
    						echo "SQL is :".$SQL." "; 
    		}
    		$myres = mysql_fetch_array($result);
    		if($myres['post_content']==NULL){
    		continue;
    		}
    		
    		$mynewproid = getID($myres['post_author']);
    		$myres['post_content'] = str_replace('\'','\\\'',$myres['post_content']);
    				
    		$SQL = 'INSERT INTO notice (id,profile_id,uri,content,rendered,created,modified,is_local,source,conversation) VALUES';
    		$SQL .= '('.$newID.','.$mynewproid.',\''.'http://blog.recgo.com/notice/'.$newID.'\',\''.$myres['post_content'].'\',\''.$myres['post_content'].'\',\''.$myres['post_modified_gmt'].'\',\''.$myres['post_modified'].'\','.'1'.',\''.'RecgoWPmblog'.'\','.$newConID.')';
    		
    		if (!mysql_query($SQL)){ 
    						echo "Execution ERROR :".mysql_error()." "; 
    						echo "SQL is :".$SQL." "; 
    		}
    				
    		$SQL = 'INSERT INTO conversation (id,uri,created,modified) VALUES';
    		$SQL .= '('.$newConID.',\''.'http://blog.recgo.com/conversation/'.$newConID.'\',\''.$myres['post_modified_gmt'].'\',\''.$myres['post_modified'].'\')';
    		
    		//echo $SQL;
    		if (!mysql_query($SQL)){ 
    						echo "Execution ERROR :".mysql_error()." "; 
    						echo "SQL is :".$SQL." "; 
    		}
    		
    		$newID2=$newID;
    		$newID++;
    		
    		//reply
    		$SQL = 'SELECT * FROM wp_comments WHERE comment_approved = 1 AND comment_post_ID = '.$oldID.' ORDER BY comment_ID';
    		if (!$result = mysql_query($SQL)){ 
    						echo "Execution ERROR :".mysql_error()." "; 
    						echo "SQL is :".$SQL." "; 
    		}
    		
    		while($myres = mysql_fetch_array($result))
    		{
    			if($myres['comment_content']==NULL){
    			continue;
    			}
    			
    			$mynewproid = getID($myres['comment_author']);
    			$commentID2newreplyto[$myres['comment_ID']]=$newID;
    			if($myres['comment_parent']!=0)
    			{
    				$newreplyto=$commentID2newreplyto[$myres['comment_parent']];
    			}
    			else
    			{
    				$newreplyto=$newID2;
    			}
    			
    			if($mynewproid == 3)
    			{
    				$myres['comment_content'] = '@user1 '.$myres['comment_content'];
    				$myreplyproid = 4;
    			}
    			else if($mynewproid == 4)
    			{
    				$myres['comment_content'] = '@user2 '.$myres['comment_content'];
    				$myreplyproid = 3;
    			}
    			$myres['comment_content'] = str_replace('\'','\\\'',$myres['comment_content']);
    			$myres['comment_content'] = str_replace('\"','\\\"',$myres['comment_content']);
    			
    			$SQL = 'INSERT INTO notice (id,profile_id,uri,content,rendered,created,modified,is_local,source,conversation,reply_to) VALUES';
    			$SQL .= '('.$newID.','.$mynewproid.',\''.'http://blog.recgo.com/notice/'.$newID.'\',\''.$myres['comment_content'].'\',\''.$myres['comment_content'].'\',\''.$myres['comment_date_gmt'].'\',\''.$myres['comment_date'].'\','.'1'.',\''.'RecgoWPmblog'.'\','.$newConID.','.$newreplyto.')';
    			
    			//echo $myres['comment_content'].'\n';
    			if (!mysql_query($SQL)){ 
    							echo "Execution ERROR :".mysql_error()." "; 
    							echo "SQL is :".$SQL." "; 
    			}
    			
    			$SQL = 'INSERT INTO reply (notice_id,profile_id,modified) VALUES';
    			$SQL .= '('.$newID.','.$myreplyproid.',\''.$myres['comment_date'].'\')';
    			
    			if (!mysql_query($SQL)){ 
    							echo "Execution ERROR :".mysql_error()." "; 
    							echo "SQL is :".$SQL." "; 
    			}
    			
    			$newID++;
    		}
    		$newConID++;
    	}
    
    			}
    			else
    			{
    				$self_des = "";
    				echo '<br>Linked to MySQL , Can\'t open database ';
    			}
    		}
    		else
    		{
    			$self_des = "";
    			echo '<br>Unable to link to Database ';
    		}
    		mysql_close($dblink);
    
    exit();
    ?>

    Good Luck ^_^

    2010.05.22 / 暂无评论 / 764 次点击 / 分类: 所谓技术

  • IIS7下WordPress中文Tag和目录无法访问完美解决方法(不修改程序)

    方法很简单。新建一个“_chineseuri.php”文件,内容如下:

    <?php
    
    // IIS Mod-Rewrite
    if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
    }
    // IIS Isapi_Rewrite
    else if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
    $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
    }
    else
    {
    // Use ORIG_PATH_INFO if there is no PATH_INFO
    if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) )
    $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
    
    // Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)
    if ( isset($_SERVER['PATH_INFO']) ) {
    if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )
    $_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
    else
    $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
    }
    
    // Append the query string if it exists and isn't null
    if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
    $_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
    }
    }
    
    require("index.php");
    
    ?> 

    然后建立“web.config”文件,如果已经有同名文件就把原来的删掉,其内容如下:

    <configuration>   
      <system.webServer>   
        <rewrite>   
          <rules>  
          	<rule name="Chinese Tag and Category for WordPress" stopProcessing="true">
              <match url="^(tag|category)/(.*)$" />
              <action type="Rewrite" url="_chineseuri.php"/>
            </rule>
            <rule name="wordpress" patternSyntax="Wildcard">   
              <match url="*" />   
                <conditions>   
                  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />   
                  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />   
                </conditions>   
              <action type="Rewrite" url="index.php" />   
            </rule>        
          </rules>   
        </rewrite>   
      </system.webServer>   
    </configuration>

    如果你的Wordpress不是装在根目录,则需要更改“<match url="^(tag|category)/(.*)$" /> ”为“<match url="^你的目录/(tag|category)/(.*)$" /> ”。如果你把默认的标签和目录的地址改了,则更改这句话里面的对应内容即可。

    把上面两个文件上传至Wordpress所在的根目录(即web.config所在的目录)覆盖原来的文件即可。

    参考更改Wordpress源文件解决这个问题的文章,我们可以知道,是$_SERVER['REQUEST_URI']和$_SERVER['PATH_INFO']的问题。原因太多了,就不罗嗦了,想要明白解决问题的原理是什么,自己查看上面两份代码吧,呵呵。

    2010.05.13 / 1 条评论 / 1,395 次点击 / 分类: 所谓技术

  • WordPress用.htpasswd保护wp-admin文件夹后访问提示404解决办法

    前情提要:
    当然,推荐的选项是设置密码保护,这意味着你仍然可以在任何地方连接到 wp-admin 目录,
    但我们增加了一道防线,以防越权操作。

    .htaccess 文件
    WP � ADMIN 中的 .HTACCESS 文件如下:
    #this file should be outside your webroot.
    AuthUserFile /srv/www/user1/.htpasswd
    AuthType Basic
    AuthName “Blog”
    require user youruser #making this username difficult to guess can help mitigate password
    brute force attacks.

    .htpasswd 文件
    正如已经说明的,该文件 可以放到网站目录之外的地方,上层目录是个很好的选择。
    $ htpasswd �cm .htpasswd blog
    New password:
    Re�type new password:
    Adding password for user blog
    .htpasswd 文件已经在当前目录中创建了,请确保本文件的地址符合 wp�admin/.htaccess 中
    AuthUserFile 所设置的地址。

    当你试图登录博客时会要求你输入用户名和密码以获得连
    接权限。如果没有出现的话,查看一下加密密码文件,然后查看所提供的地址是否正确。

    出现问题:
    用.htpasswd保护wp-admin文件夹后访问提示404
    我在wp-admin文件夹下写了.htpasswd和.htaccess,.htaccess文件内容如下:

    AuthUserFile /home/public_html/wp-admin/.htpasswd
    AuthName "Please enter your ID and password"
    AuthType Basic
    require valid-user

    然后我再次访问wp-admin时,发现需要验证用户名和密码。
    但当我打开rewrite后,发现访问wp-admin时,跳转到的是wp的404提示页面。

     
    问题分析:
    主机商把错误文档重新定义了,然后访问这个时,发了个401要授权的http头,但由于错误文档重定义,而这时Apache又找不到重新定义的文档,所以就抛出了个404的http头,所以被识别成了404错误。
     
    解决办法:
    在wp-admin文件夹的.htaccess顶部加上
    (使用默认的错误页面)
    ErrorDocument 401 default
    (错误档案使用自己指定字符串)
    ErrorDocument 401 "Unauthorized access"
    (使用自己指定的错误页面)
    ErrorDocument 401 /401.html
    以上方法三选一,其实就是一种方法——重新定义一个存在的401提示页面。
     

    2009.08.11 / 1 条评论 / 1,879 次点击 / 分类: 随心随感

  • WordPress与Discuz的Rewrite共存(方法二)

    WP装在/blog文件夹,DZ装在/bbs文件夹。重写成功。
    这是规则,放在站点根目录下.htaccess即可。
    #这是正确的 wordpress+discuz 共生.htaccess
    <IfModule mod_rewrite.c>
    RewriteEngine On
    #即使DZ装在/bbs目录,还是这么写RewriteBase:
    RewriteBase /
    RewriteRule ^bbs/archiver/((fid|tid)-[\w\-]+\.html)$ bbs/archiver/index.php?$1
    RewriteRule ^bbs/forum-([0-9]+)-([0-9]+)\.html$ bbs/forumdisplay.php?fid=$1&page=$2
    RewriteRule ^bbs/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ bbs/viewthread.php?tid=$1&extra=page\%3D$3&page=$2
    RewriteRule ^bbs/space-(username|uid)-(.+)\.html$ bbs/space.php?$1=$2
    RewriteRule ^bbs/tag-(.+)\.html$ bbs/tag.php?name=$1
    </IfModule>
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    #下面如果是WP装在根目录就是RewriteRule . /index.php [L]
    RewriteRule . /blog/index.php [L]
    </IfModule>
    # END WordPress
    这个方法可行,但还是推荐这种方法:http://blog.creke.net/2009/08/wordpressdiscuzrewrite.html。因为它更便于管理

    2009.08.08 / 6 条评论 / 11,246 次点击 / 分类: 所谓技术

  • wordpress与discuz的Rewrite共存

    自从使用了CPH的LAMP服务器之后,我就开始在上面试验一些php+mysql应用,其中首先弄的就是discuz了。

    安装了discuz6.0.0之后,基本上运行正常,但是一个最重要的功能urlrewrite一直搞不定,直到今天在本地弄xampp才无意之中发现了问题所在。

    和wordpress不一样,当你在discuz后台选择使用url静态化之后,并不会自动生成相应的.htaccess文件,而是指导你"相应规则请参考《用户使用说明书》的高级使用部分"。
    google一下知道这个Discuz! 用户使用说明书,然后找到高级应用里面的url静态化:http://www.discuz.net/usersguide/advanced_urlrewrite.htm

    按照discuz所说的,对于Apache Web Server(虚拟主机用户),应该进行如下操作:

    检查论坛所在目录中是否存在 .htaccess 文件,如果不存在,请手工建立此文件。Win32 系统下,无法直接建立 .htaccess 文件,您可以从其他系统中拷贝一份,或者在 Discuz.net 技术支持栏目中下载此文件。编辑并修改 .htaccess 文件,添加以下内容

    # 将 RewriteEngine 模式打开
    RewriteEngine On
    # 修改以下语句中的 /discuz 为你的论坛目录地址,如果程序放在根目录中,请将 /discuz 修改为 /
    RewriteBase /discuz
    # Rewrite 系统规则请勿修改
    RewriteRule ^archiver/((fid|tid)-[w-]+.html)$ archiver/index.php?$1
    RewriteRule ^forum-([0-9]+)-([0-9]+).html$ forumdisplay.php?fid=$1&page=$2
    RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+).html$ viewthread.php?tid=$1&extra=page%3D$3&page=$2
    RewriteRule ^space-(username|uid)-(.+).html$ space.php?$1=$2
    RewriteRule ^tag-(.+).html$ tag.php?name=$1

    添加内容时,请遵照上面的提示,修改论坛所在的路径,然后保存。将 .htaccess 文件上传到论坛所在的目录中。然后进入论坛系统设置的搜索引擎优化,根据需要开启 URL 静态化功能。

    我这样做了之后不但没有效果,而且连论坛都访问不了,提示HTTP500错误。

    今天在本地安装了xampp之后,装了discuz,重新按照上面的方法测试,还是不行,然后又安装了wordpress并成功使用了urlrewrite。
    打开wordpress自动生成的.htaccess文件和discuz的来比较,终于看出来问题:
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /wordpress/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wordpress/index.php [L]
    </IfModule>
    # END WordPress

    很明显,discuz官方的资料少了两行:
    <IfModule mod_rewrite.c>
    </IfModule>

    按照wordpress的加上去,在本地和CPH服务器上都成功了。
    我对.htaccess文件不是很懂,完全是自己尝试出来的,补充几点:
    首先是<IfModule mod_rewrite.c></IfModule>不能少,这大概是判断mod_rewrite是否存在的。
    其次是RewriteEngine On这个应该是Rewrite引擎打开,也不能少。
    然后是RewriteBase /这个很重要,如果安装在根目录就保持这样,如果不是,就要把/替换成所在的目录,相对于web根目录。
    例如你把discuz安装在http://127.0.0.1/bbs,那么就要写成RewriteBase /bbs/才可以,这样也方便了多个rewrite共存。
    最后是.htaccess文件的位置,如果你的根目录下有bbs和wordpress两个目录对应http://127.0.0.1/bbshttp://127.0.0.1/wordpress,那么可以分别创建两个.htaccess文件放在这两个目录里。
    例如我是这样的:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /wordpress/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wordpress/index.php [L]
    </IfModule>

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /bbs/
    RewriteRule ^archiver/((fid|tid)-[w-]+.html)$ archiver/index.php?$1
    RewriteRule ^forum-([0-9]+)-([0-9]+).html$ forumdisplay.php?fid=$1&page=$2
    RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+).html$ viewthread.php?tid=$1&extra=page%3D$3&page=$2
    RewriteRule ^space-(username|uid)-(.+).html$ space.php?$1=$2
    RewriteRule ^tag-(.+).html$ tag.php?name=$1
    </IfModule>

    注意加粗部分哦。

    2009.08.08 / 暂无评论 / 1,061 次点击 / 分类: 所谓技术

  • 这不是升级,这是寂寞――Creke ACG升级至wordpress 2.8.3

    这不是升级,这是寂寞——Creke ACG升级至wordpress 2.8.3
     
    这次升级的形象代言人是——绿坝娘同学!

    升级维护页面截图:

    wp_updated_page.jpg

    这不是升级,这是寂寞 | Creke ACG

    如果你以为本站“被维护”,那么很可惜,本站只是升级系统。目前已经升级完毕并恢复正常运作。以下是wordpress成功升级到2.8.3的截图,留念一下:

    wp_updated_suc.jpg

    wordpress成功升级到2.8.3

    话说今天出了wp2.8.3,马上看到有人��地在说:“我刚升级到2.8.2没几天,今天又出新版……”幸亏昨天Creke ACG的在线升级因不明原因没有成功,结果今天一大早就看到wordpress出了2.8.3的新闻,下午就相应看到中文版也出了的新闻。然后今天慢慢覆盖升级,终于也OK了。

    简要概况升级几个步骤:

    1. 升级各种主题、插件等到最新版
    2. 停用各种插件
    3. 将主题换回默认主题
    4. 删除相应缓存
    5. 将最新wordpress系统覆盖网站原系统;或删除相应文件夹后上传新版wordpress,注意不要把插件和主题也删了,否则就再传一遍吧!
    6. 按照提示访问“/wp-admin/upgrade.php”升级数据库,也可能不需要,反正需要就会自动提示的。
    7. 登入后台,启用主题和各个插件,建议启用并配置好其它插件后,最后再启用缓存插件
    8. 升级完了,截个图写个心得充下版面

    新版的Creke ACG的特点:

    1. 更快,更稳定,更安全!
    2. 更X,更H,更��(这是因为管理员的原因)
    3. 特色内容更多更丰富(不然怎么叫特“色”)
    4. 小唧更聪明(向来就不笨,只是天然呆……�……话说有谁给小唧做过人设没?小唧的人工智能库都是根据什么性格开发的呀???�!)
    5. 网站提示更有爱(这个慢慢体会吧)

    以上。

    2009.08.04 / 暂无评论 / 632 次点击 / 分类: 所谓技术