Solved

404 Error for Crawlers and "Text-Based" Browsers

Posted on 2009-04-12
24
1,521 Views
Last Modified: 2012-05-06
Hi,

I don't know why, but there is one page in my site that does not get indexed by Google.  I looked into it, and it was because Google was getting a 404 error for the page every time.  I looked into that, and noted that the page was perfectly navigable.  It exists!  So perplexed, I tried browsing on my blackberry, and I got the 404 error.  It seems that the page is not visible for crawlers and perhaps simple "text-based" browsers (or whatever you want to call it), such as the BlackBerry's (note that the new BlackBerry browsers on the Bold etc. are updated and there is no error).  

The page is: http://cmnycakes.com/blog/

Don't know if it's my joomla install (v1.0 btw) .htaccess page, my robots.txt (unlikely in my opinion) or SH404SEF, or even the blog, which is the mojoblog component.  I've looked into all of them and can't figure it out.  My guess would be .htaccess or SH404SEF but I don't get it.  

Note that other sub-pages within the blog are perfectly navigable (sub-pages of the same component).  It's just the main http://cmnycakes.com/blog/ page.

What gives?  

Thanks!
0
Comment
Question by:rsokhi
  • 11
  • 7
  • 4
24 Comments
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24126335
These are the headers returned for that page, note the 404 on first line.
HTTP/1.1 404 Not Found

Date: Sun, 12 Apr 2009 17:32:04 GMT

Server: Apache/2.2.11 (Unix) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635

X-Powered-By: PHP/5.2.9

X-Pingback: http://cmnycakes.com/components/com_mojo/xmlrpc.php

Expires: Mon, 26 Jul 1997 05:00:00 GMT

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Pragma: no-cache

Set-Cookie: 3becb791174e9f84f1f1b05e7aed1641=-; path=/

Last-Modified: Sun, 12 Apr 2009 17:32:13 GMT

Transfer-Encoding: chunked

Content-Type: text/html

Open in new window

0
 
LVL 3

Expert Comment

by:iserko
ID: 24126348
Can you output the htaccess for your Joomla in here? I can't seem to find any mention of /blog in the downloaded version of Joomla
0
 

Author Comment

by:rsokhi
ID: 24126440
@ cxr: that's fascinating.  I just used my Web Developer tool in Firefox and saw the same thing.  Don't know how to fix it though.

@jserko: code snippet below:
##

# @version $Id: htaccess.txt 1005 2005-11-13 17:33:59Z stingrey $

# @package Joomla

# @copyright Copyright (C) 2005 Open Source Matters. All rights reserved.

# @license http://www.gnu.org/copyleft/gpl.html GNU/GPL

# Joomla! is Free Software

##
 

Options +FollowSymLinks
 

#

#  mod_rewrite in use

#
 

RewriteEngine On
 

#  Uncomment following line if your webserver's URL 

#  is not directly related to physical file paths.

#  Update YourJoomlaDirectory (just / for root)
 

# RewriteBase /YourJoomlaDirectory
 

#

#  Rules

#
 

#RewriteCond %{REQUEST_FILENAME} !\.(jpg|jpeg|gif|png|css|js|pl|txt)$

#RewriteCond %{REQUEST_FILENAME} !-f

#RewriteCond %{REQUEST_FILENAME} !-d

#RewriteRule ^(.*) index.php
 

RewriteCond %{REQUEST_FILENAME} !\.(jpg|jpeg|gif|png|css|js|pl|txt)$

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*) index.php

# BEGIN WordPress

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php

</IfModule>
 

# END WordPress

Open in new window

0
 

Author Comment

by:rsokhi
ID: 24126448
@jserko: At your question about "blog" and joomla, what I have is the mojoblog component installed on joomla, which is a modification of Wordpress.

Now the htaccess may be a bit butchered as I've had to it edit quite a few times to get a few things to work, including getting gallery2bridge to work, and especially sh404sef.
0
 
LVL 3

Expert Comment

by:iserko
ID: 24126465
Well I think your problem is the htaccess ... Do you see any mention of rewriting stuff based on the User-Agent ?
0
 

Author Comment

by:rsokhi
ID: 24126526
Honestly I have no idea.  My question I guess from here is, since I have no idea what it could be, and would probably have to reinstall everything to get rid of it, is there a way for a "quickfix" in the htaccess for the 404 error not to show?  How can the page display but the headers say 404?  I don't get it!
0
 
LVL 3

Expert Comment

by:iserko
ID: 24126535
Apache's mod_rewrite has the ability to rewrite a URL depending on the User-Agent you are using.

Let's say ... I'm using Firefox to view the page, and you're using Opera.

The Google bot uses a custom user-agent named Google bot I think. It could be possible that Mojoblog, sh404sef or something else put that rewrite condition in there.

Try this: search all the files in the Joomla directory for "RewriteCond" ... put the results in your answer
0
 

Author Comment

by:rsokhi
ID: 24126582
I'm running a search right now.  

If I understood you correctly, are you saying that the custom rewrite is wrong just for Googlebot?  I don't think that's what's going on, especially when you get the 404 error in Firefox as well.  Check out the headers on the page...just as cxr had done, which I confirmed.  All the other pages come up with 200.  The rewrite is from http://cmnycakes.com/index.php?option=com_mojo&Itemid=34&lang=en to http://cmnycakes.com/blog/.

Correct me if I misunderstood
0
 

Author Comment

by:rsokhi
ID: 24126604
Here's the only file with rewrites going on it seems, other than .htaccess:
<?php

/**

  * @version $Id: classes.php, v 1.1 2007/07/07 11:55:55 visualweb Exp $ 

  * @package com_mojo

  * @copyright (c) 1guywebdesign.com 

  * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL 

  */

defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
 

class WP_Query {

	var $query;

	var $query_vars;

	var $queried_object;

	var $queried_object_id;
 

	var $posts;

	var $post_count = 0;

	var $current_post = -1;

	var $in_the_loop = false;

	var $post;
 

	var $is_single = false;

	var $is_preview = false;

	var $is_page = false;

	var $is_archive = false;

	var $is_date = false;

	var $is_year = false;

	var $is_month = false;

	var $is_day = false;

	var $is_time = false;

	var $is_author = false;

	var $is_category = false;

	var $is_search = false;

	var $is_feed = false;

	var $is_trackback = false;

	var $is_home = false;

	var $is_404 = false;

	var $is_comments_popup = false;

	var $is_wp_admin = false;

	var $is_attachment = false;
 

	function init_query_flags() {

		$this->is_single = false;

		$this->is_page = false;

		$this->is_archive = false;

		$this->is_date = false;

		$this->is_year = false;

		$this->is_month = false;

		$this->is_day = false;

		$this->is_time = false;

		$this->is_author = false;

		$this->is_category = false;

		$this->is_search = false;

		$this->is_feed = false;

		$this->is_trackback = false;

		$this->is_home = false;

		$this->is_404 = false;

		$this->is_paged = false;

		$this->is_wp_admin = false;

		$this->is_attachment = false;

	}

	

	function init () {

		unset($this->posts);

		unset($this->query);

		unset($this->query_vars);

		unset($this->queried_object);

		unset($this->queried_object_id);

		$this->post_count = 0;

		$this->current_post = -1;

		$this->in_the_loop = false;

		

		$this->init_query_flags();

	}
 

	// Reparse the query vars.

	function parse_query_vars() {

		$this->parse_query('');

	}
 

	// Parse a query string and set query type booleans.

	function parse_query ($query) {

		if ( !empty($query) || !isset($this->query) ) {

			$this->init();

			parse_str($query, $qv);

			$this->query = $query;

			$this->query_vars = $qv;

		}
 

		if ('404' == $qv['error']) {

			$this->is_404 = true;

			if ( !empty($query) ) {

				do_action('parse_query', array(&$this));

			}

			return;

		}
 

		$qv['m'] =  (int) $qv['m'];

		$qv['p'] =  (int) $qv['p'];
 

		// Compat.  Map subpost to attachment.

		if ( '' != $qv['subpost'] )

			$qv['attachment'] = $qv['subpost'];

		if ( '' != $qv['subpost_id'] )

			$qv['attachment_id'] = $qv['subpost_id'];

			

		if ( ('' != $qv['attachment']) || (int) $qv['attachment_id'] ) {

			$this->is_single = true;

			$this->is_attachment = true;

		} elseif ('' != $qv['name']) {

			$this->is_single = true;

		} elseif ( $qv['p'] ) {

			$this->is_single = true;

		} elseif (('' != $qv['hour']) && ('' != $qv['minute']) &&('' != $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day'])) {

			// If year, month, day, hour, minute, and second are set, a single 

			// post is being queried.        

			$this->is_single = true;

		} elseif ('' != $qv['static'] || '' != $qv['pagename'] || '' != $qv['page_id']) {

			$this->is_page = true;

			$this->is_single = false;

		} elseif (!empty($qv['s'])) {

			$this->is_search = true;

			switch ($qv['show_post_type']) {

			case 'page' :

				$this->is_page = true;

				break;

			case 'attachment' :

				$this->is_attachment = true;

				break;

			}

		} else {

		// Look for archive queries.  Dates, categories, authors.
 

			if ( (int) $qv['second']) {

				$this->is_time = true;

				$this->is_date = true;

			}
 

			if ( (int) $qv['minute']) {

				$this->is_time = true;

				$this->is_date = true;

			}
 

			if ( (int) $qv['hour']) {

				$this->is_time = true;

				$this->is_date = true;

			}
 

			if ( (int) $qv['day']) {

				if (! $this->is_date) {

					$this->is_day = true;

					$this->is_date = true;

				}

			}
 

			if ( (int)  $qv['monthnum']) {

				if (! $this->is_date) {

					$this->is_month = true;

					$this->is_date = true;

				}

			}
 

			if ( (int)  $qv['year']) {

				if (! $this->is_date) {

					$this->is_year = true;

					$this->is_date = true;

				}

			}
 

			if ( (int)  $qv['m']) {

				$this->is_date = true;

				if (strlen($qv['m']) > 9) {

					$this->is_time = true;

				} else if (strlen($qv['m']) > 7) {

					$this->is_day = true;

				} else if (strlen($qv['m']) > 5) {

					$this->is_month = true;

				} else {

					$this->is_year = true;

				}

			}
 

			if ('' != $qv['w']) {

				$this->is_date = true;

			}
 

			if (empty($qv['cat']) || ($qv['cat'] == '0')) {

				$this->is_category = false;

			} else {

				if (stristr($qv['cat'],'-')) {

					$this->is_category = false;

				} else {

					$this->is_category = true;

				}

			}
 

			if ('' != $qv['category_name']) {

				$this->is_category = true;

			}

            

			if ((empty($qv['author'])) || ($qv['author'] == '0')) {

				$this->is_author = false;

			} else {

				$this->is_author = true;

			}
 

			if ('' != $qv['author_name']) {

				$this->is_author = true;

			}
 

			if ( ($this->is_date || $this->is_author || $this->is_category)) {

				$this->is_archive = true;

			}
 

			if ( 'attachment' == $qv['show_post_type'] ) {

				$this->is_attachment = true;

			}

		}
 

		if ('' != $qv['feed']) {

			$this->is_feed = true;

		}
 

		if ('' != $qv['tb']) {

			$this->is_trackback = true;

		}
 

		if ('' != $qv['paged']) {

			$this->is_paged = true;

		}
 

		if ('' != $qv['comments_popup']) {

			$this->is_comments_popup = true;

		}
 

		if (strstr($_SERVER['PHP_SELF'], 'wp-admin/')) {

			$this->is_wp_admin = true;

		}
 

		if ( ! ($this->is_attachment || $this->is_archive || $this->is_single || $this->is_page || $this->is_search || $this->is_feed || $this->is_trackback || $this->is_404 || $this->is_wp_admin || $this->is_comments_popup)) {

			$this->is_home = true;

		}
 

		if ( !empty($query) ) {

			do_action('parse_query', array(&$this));

		}

	}
 

	function set_404() {

		$this->init_query_flags();

		$this->is_404 = true;	

	}

	

	function get($query_var) {

		if (isset($this->query_vars[$query_var])) {

			return $this->query_vars[$query_var];

		}
 

		return '';

	}
 

	function set($query_var, $value) {

		$this->query_vars[$query_var] = $value;

	}
 

	function &get_posts() {

		global $wpdb, $pagenow, $request, $my;
 

		do_action('pre_get_posts', array(&$this));
 

		// Shorthand.

		$q = $this->query_vars;	
 

		// First let's clear some variables

		$whichcat = '';

		$whichauthor = '';

		$whichpage = '';

		$result = '';

		$where = '';

		$limits = '';

		$distinct = '';

		$join = '';
 

		if ( !isset($q['posts_per_page']) || $q['posts_per_page'] == 0 )

			$q['posts_per_page'] = get_settings('posts_per_page');

		if ( !isset($q['what_to_show']) )

			$q['what_to_show'] = get_settings('what_to_show');

		if ( isset($q['showposts']) && $q['showposts'] ) {

			$q['showposts'] = (int) $q['showposts'];

			$q['posts_per_page'] = $q['showposts'];

		}

		if ( (isset($q['posts_per_archive_page']) && $q['posts_per_archive_page'] != 0) && ($this->is_archive || $this->is_search) )

			$q['posts_per_page'] = $q['posts_per_archive_page'];

		if ( !isset($q['nopaging']) ) {

			if ($q['posts_per_page'] == -1) {

				$q['nopaging'] = true;

			} else {

				$q['nopaging'] = false;

			}

		}

		if ( $this->is_feed ) {

			$q['posts_per_page'] = get_settings('posts_per_rss');

			$q['what_to_show'] = 'posts';

		}
 

		if (isset($q['page'])) {

			$q['page'] = trim($q['page'], '/');

			$q['page'] = (int) $q['page'];

		}

	

		$add_hours = intval(get_settings('gmt_offset'));

		$add_minutes = intval(60 * (get_settings('gmt_offset') - $add_hours));

		$wp_posts_post_date_field = "post_date"; // "DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)";
 

		// If a month is specified in the querystring, load that month

		if ( (int) $q['m'] ) {

			$q['m'] = '' . preg_replace('|[^0-9]|', '', $q['m']);

			$where .= ' AND YEAR(post_date)=' . substr($q['m'], 0, 4);

			if (strlen($q['m'])>5)

				$where .= ' AND MONTH(post_date)=' . substr($q['m'], 4, 2);

			if (strlen($q['m'])>7)

				$where .= ' AND DAYOFMONTH(post_date)=' . substr($q['m'], 6, 2);

			if (strlen($q['m'])>9)

				$where .= ' AND HOUR(post_date)=' . substr($q['m'], 8, 2);

			if (strlen($q['m'])>11)

				$where .= ' AND MINUTE(post_date)=' . substr($q['m'], 10, 2);

			if (strlen($q['m'])>13)

				$where .= ' AND SECOND(post_date)=' . substr($q['m'], 12, 2);

		}
 

		if ( (int) $q['hour'] ) {

			$q['hour'] = '' . intval($q['hour']);

			$where .= " AND HOUR(post_date)='" . $q['hour'] . "'";

		}
 

		if ( (int) $q['minute'] ) {

			$q['minute'] = '' . intval($q['minute']);

			$where .= " AND MINUTE(post_date)='" . $q['minute'] . "'";

		}
 

		if ( (int) $q['second'] ) {

			$q['second'] = '' . intval($q['second']);

			$where .= " AND SECOND(post_date)='" . $q['second'] . "'";

		}
 

		if ( (int) $q['year'] ) {

			$q['year'] = '' . intval($q['year']);

			$where .= " AND YEAR(post_date)='" . $q['year'] . "'";

		}
 

		if ( (int) $q['monthnum'] ) {

			$q['monthnum'] = '' . intval($q['monthnum']);

			$where .= " AND MONTH(post_date)='" . $q['monthnum'] . "'";

		}
 

		if ( (int) $q['day'] ) {

			$q['day'] = '' . intval($q['day']);

			$where .= " AND DAYOFMONTH(post_date)='" . $q['day'] . "'";

		}
 

		// Compat.  Map subpost to attachment.

		if ( '' != $q['subpost'] )

			$q['attachment'] = $q['subpost'];

		if ( '' != $q['subpost_id'] )

			$q['attachment_id'] = $q['subpost_id'];
 

		if ('' != $q['name']) {

			$q['name'] = sanitize_title($q['name']);

			$where .= " AND post_name = '" . $q['name'] . "'";

		} else if ('' != $q['pagename']) {

			$q['pagename'] = str_replace('%2F', '/', urlencode(urldecode($q['pagename'])));

			$page_paths = '/' . trim($q['pagename'], '/');

			$q['pagename'] = sanitize_title(basename($page_paths));

			$q['name'] = $q['pagename'];

			$page_paths = explode('/', $page_paths);

			foreach($page_paths as $pathdir)

				$page_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);

				

			$all_page_ids = get_all_page_ids();

			$reqpage = 0;

			foreach ( $all_page_ids as $page_id ) {

				$page = get_page($page_id);

				if ( $page->fullpath == $page_path ) {

					$reqpage = $page_id;

					break;

				}

			}

			

			$where .= " AND (ID = '$reqpage')";

		} elseif ('' != $q['attachment']) {

			$q['attachment'] = sanitize_title($q['attachment']);

			$q['name'] = $q['attachment'];

			$where .= " AND post_name = '" . $q['attachment'] . "'";

		}
 

		if ( (int) $q['w'] ) {

			$q['w'] = ''.intval($q['w']);

			$where .= " AND WEEK(post_date, 1)='" . $q['w'] . "'";

		}
 

		if ( intval($q['comments_popup']) )

			$q['p'] = intval($q['comments_popup']);
 

		// If a attachment is requested by number, let it supercede any post number.

		if ( ($q['attachment_id'] != '') && (intval($q['attachment_id']) != 0) )

			$q['p'] = (int) $q['attachment_id'];
 

		// If a post number is specified, load that post

		if (($q['p'] != '') && intval($q['p']) != 0) {

			$q['p'] =  (int) $q['p'];

			$where = ' AND ID = ' . $q['p'];

		}
 

		if (($q['page_id'] != '') && (intval($q['page_id']) != 0)) {

			$q['page_id'] = intval($q['page_id']);

			$q['p'] = $q['page_id'];

			$where = ' AND ID = '.$q['page_id'];

		}
 

		// If a search pattern is specified, load the posts that match

		if (!empty($q['s'])) {

			$q['s'] = addslashes_gpc($q['s']);

			$search = ' AND (';

			$q['s'] = preg_replace('/, +/', ' ', $q['s']);

			$q['s'] = str_replace(',', ' ', $q['s']);

			$q['s'] = str_replace('"', ' ', $q['s']);

			$q['s'] = trim($q['s']);

			if ($q['exact']) {

				$n = '';

			} else {

				$n = '%';

			}

			if (!$q['sentence']) {

				$s_array = explode(' ',$q['s']);

				$q['search_terms'] = $s_array;

				$search .= '((post_title LIKE \''.$n.$s_array[0].$n.'\') OR (post_content LIKE \''.$n.$s_array[0].$n.'\'))';

				for ( $i = 1; $i < count($s_array); $i = $i + 1) {

					$search .= ' AND ((post_title LIKE \''.$n.$s_array[$i].$n.'\') OR (post_content LIKE \''.$n.$s_array[$i].$n.'\'))';

				}

				$search .= ' OR (post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\')';

				$search .= ')';

			} else {

				$search = ' AND ((post_title LIKE \''.$n.$q['s'].$n.'\') OR (post_content LIKE \''.$n.$q['s'].$n.'\'))';

			}

		}
 

		// Category stuff
 

		if ((empty($q['cat'])) || ($q['cat'] == '0') || 

				// Bypass cat checks if fetching specific posts

				( $this->is_single || $this->is_page )) {

			$whichcat='';

		} else {

			$q['cat'] = ''.urldecode($q['cat']).'';

			$q['cat'] = addslashes_gpc($q['cat']);

			if (stristr($q['cat'],'-')) {

				// Note: if we have a negative, we ignore all the positives. It must

				// always mean 'everything /except/ this one'. We should be able to do

				// multiple negatives but we don't :-(

				$eq = '!=';

				$andor = 'AND';

				$q['cat'] = explode('-',$q['cat']);

				$q['cat'] = intval($q['cat'][1]);

			} else {

				$eq = '=';

				$andor = 'OR';

			}

			$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) ";

			$cat_array = preg_split('/[,\s]+/', $q['cat']);

			$whichcat .= ' AND (category_id '.$eq.' '.intval($cat_array[0]);

			$whichcat .= get_category_children($cat_array[0], ' '.$andor.' category_id '.$eq.' ');

			for ($i = 1; $i < (count($cat_array)); $i = $i + 1) {

				$whichcat .= ' '.$andor.' category_id '.$eq.' '.intval($cat_array[$i]);

				$whichcat .= get_category_children($cat_array[$i], ' '.$andor.' category_id '.$eq.' ');

			}

			$whichcat .= ')';

			if ($eq == '!=') {

				$q['cat'] = '-'.$q['cat']; // Put back the knowledge that we are excluding a category.

			}

		}
 

		// Category stuff for nice URIs
 

		global $cache_categories;

		if ('' != $q['category_name']) {

			$cat_paths = '/' . trim(urldecode($q['category_name']), '/');

			$q['category_name'] = sanitize_title(basename($cat_paths));

			$cat_paths = explode('/', $cat_paths);

			foreach($cat_paths as $pathdir)

				$cat_path .= ($pathdir!=''?'/':'') . sanitize_title($pathdir);
 

			$all_cat_ids = get_all_category_ids();

			$q['cat'] = 0;			

			foreach ( $all_cat_ids as $cat_id ) {

				$cat = get_category($cat_id);

				if ( $cat->fullpath == $cat_path ) {

					$q['cat'] = $cat_id;

					break;

				}

			}
 

			$tables = ", $wpdb->post2cat, $wpdb->categories";

			$join = " LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) LEFT JOIN $wpdb->categories ON ($wpdb->post2cat.category_id = $wpdb->categories.cat_ID) ";

			$whichcat = " AND (category_id = '" . $q['cat'] . "'";

			$whichcat .= get_category_children($q['cat'], " OR category_id = ");

			$whichcat .= ")";

		}
 

		// Author/user stuff
 

		if ((empty($q['author'])) || ($q['author'] == '0')) {

			$whichauthor='';

		} else {

			$q['author'] = ''.urldecode($q['author']).'';

			$q['author'] = addslashes_gpc($q['author']);

			if (stristr($q['author'], '-')) {

				$eq = '!=';

				$andor = 'AND';

				$q['author'] = explode('-', $q['author']);

				$q['author'] = ''.intval($q['author'][1]);

			} else {

				$eq = '=';

				$andor = 'OR';

			}

			$author_array = preg_split('/[,\s]+/', $q['author']);

			$whichauthor .= ' AND (post_author '.$eq.' '.intval($author_array[0]);

			for ($i = 1; $i < (count($author_array)); $i = $i + 1) {

				$whichauthor .= ' '.$andor.' post_author '.$eq.' '.intval($author_array[$i]);

			}

			$whichauthor .= ')';

		}
 

		// Author stuff for nice URIs
 

		if ('' != $q['author_name']) {

			if (stristr($q['author_name'],'/')) {

				$q['author_name'] = explode('/',$q['author_name']);

				if ($q['author_name'][count($q['author_name'])-1]) {

					$q['author_name'] = $q['author_name'][count($q['author_name'])-1];#no trailing slash

				} else {

					$q['author_name'] = $q['author_name'][count($q['author_name'])-2];#there was a trailling slash

				}

			}

			$q['author_name'] = sanitize_title($q['author_name']);

			$q['author'] = $wpdb->get_var("SELECT is FROM $wpdb->users WHERE username='".$q['author_name']."'");

			$whichauthor .= ' AND (post_author = '.intval($q['author']).')';

		}

		

		$where .= $search.$whichcat.$whichauthor;
 

		if ((empty($q['order'])) || ((strtoupper($q['order']) != 'ASC') && (strtoupper($q['order']) != 'DESC'))) {

			$q['order']='DESC';

		}
 

		// Order by

		if (empty($q['orderby'])) {

			$q['orderby']='date '.$q['order'];

		} else {

			// Used to filter values

			$allowed_keys = array('author', 'date', 'category', 'title', 'modified');

			$q['orderby'] = urldecode($q['orderby']);

			$q['orderby'] = addslashes_gpc($q['orderby']);

			$orderby_array = explode(' ',$q['orderby']);

			if (!in_array($orderby_array[0],$allowed_keys)) {

				$orderby_array[0] = 'date';

			}

			$q['orderby'] = $orderby_array[0].' '.$q['order'];

			if (count($orderby_array)>1) {

				for ($i = 1; $i < (count($orderby_array)); $i = $i + 1) {

					// Only allow certain values for safety

					if (in_array($orderby_array[$i],$allowed_keys)) {

						$q['orderby'] .= ',post_'.$orderby_array[$i].' '.$q['order'];

					}

				}

			}

		}
 

		$now = gmdate('Y-m-d H:i:59');

		

		//only select past-dated posts, except if a logged in user is viewing a single: then, if they

		//can edit the post, we let them through

		if ($pagenow != 'post.php' && $pagenow != 'edit.php' && !($this->is_single && $my->id)) {

			$where .= " AND post_date_gmt <= '$now'";

			$distinct = 'DISTINCT';

		}
 

		if ( $this->is_attachment ) {

			$where .= ' AND (post_status = "attachment")';

		} elseif ($this->is_page) {

			$where .= ' AND (post_status = "static")';

		} elseif ($this->is_single) {

			$where .= ' AND (post_status != "static")';

		} else {

			$where .= ' AND (post_status = "publish"';
 

			if (isset($my->id) && ('' != intval($my->id)))

				$where .= " OR post_author = $my->id AND post_status != 'draft' AND post_status != 'static')";

			else

				$where .= ')';				

		}
 

		if (! $this->is_attachment )

			$where .= ' AND post_status != "attachment"';
 

		// Apply filters on where and join prior to paging so that any

		// manipulations to them are reflected in the paging by day queries.

		$where = apply_filters('posts_where', $where);

		$join = apply_filters('posts_join', $join);
 

		// Paging

		if (empty($q['nopaging']) && ! $this->is_single) {

			$page = $q['paged'];

			if (empty($page)) {

				$page = 1;

			}
 

			if (($q['what_to_show'] == 'posts')) {

				$pgstrt = '';

				$pgstrt = (intval($page) -1) * $q['posts_per_page'] . ', ';

				$limits = 'LIMIT '.$pgstrt.$q['posts_per_page'];

			} elseif ($q['what_to_show'] == 'days') {

				$startrow = $q['posts_per_page'] * (intval($page)-1);

				$start_date = $wpdb->get_var("SELECT max(post_date) FROM $wpdb->posts $join WHERE (1=1) $where GROUP BY year(post_date), month(post_date), dayofmonth(post_date) ORDER BY post_date DESC LIMIT $startrow,1");

				$endrow = $startrow + $q['posts_per_page'] - 1;

				$end_date = $wpdb->get_var("SELECT min(post_date) FROM $wpdb->posts $join WHERE (1=1) $where GROUP BY year(post_date), month(post_date), dayofmonth(post_date) ORDER BY post_date DESC LIMIT $endrow,1");
 

				if ($page > 1) {

					$where .= " AND post_date >= '$end_date' AND post_date <= '$start_date'";

				} else {

					$where .= " AND post_date >= '$end_date'";

				}

			}

		}
 

		// Apply post-paging filters on where and join.  Only plugins that

		// manipulate paging queries should use these hooks.

		$where = apply_filters('posts_where_paged', $where);

		$groupby = " $wpdb->posts.ID ";

		$groupby = apply_filters('posts_groupby', $groupby);

		$join = apply_filters('posts_join_paged', $join);

		$orderby = "post_" . $q['orderby'];

		$orderby = apply_filters('posts_orderby', $orderby); 

		$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";

		$request = apply_filters('posts_request', $request);
 

		$this->posts = $wpdb->get_results($request);
 

		// Check post status to determine if post should be displayed.

		if ($this->is_single) {

			$status = get_post_status($this->posts[0]);

			if ( ('publish' != $status) && ('static' != $status) ) {

				if ( ! (isset($my->id) && ('' != intval($my->id))) ) {

					// User must be logged in to view unpublished posts.

					$this->posts = array();

				} else {

					if ('draft' == $status) {

						// User must have edit permissions on the draft to preview.

						if (! current_user_can('edit_post', $this->posts[0]->ID)) {

							$this->posts = array();

						} else {

							$this->is_preview = true;

						}

					} else {

						if (! current_user_can('read_post', $this->posts[0]->ID))

							$this->posts = array();

					}

				}

			} else {

				if (mysql2date('U', $this->posts[0]->post_date_gmt) > mysql2date('U', $now)) { //it's future dated

					$this->is_preview = true;

					if (!current_user_can('edit_post', $this->posts[0]->ID)) {

						$this->posts = array ( );

					}

				}

			}

		}
 

		update_post_caches($this->posts);
 

		$this->posts = apply_filters('the_posts', $this->posts);

		$this->post_count = count($this->posts);

		if ($this->post_count > 0) {

			$this->post = $this->posts[0];

		}

		

		// Save any changes made to the query vars.

		$this->query_vars = $q;

		return $this->posts;

	}
 

	function next_post() {

        

		$this->current_post++;
 

		$this->post = $this->posts[$this->current_post];

		return $this->post;

	}
 

	function the_post() {

		global $post;

		$this->in_the_loop = true;

		$post = $this->next_post();

		setup_postdata($post);
 

		if ( $this->current_post == 0 ) // loop has just started

			do_action('loop_start');

	}
 

	function have_posts() {

		if ($this->current_post + 1 < $this->post_count) {

			return true;

		} elseif ($this->current_post + 1 == $this->post_count) {

			do_action('loop_end');

			// Do some cleaning up after the loop

			$this->rewind_posts();

		}
 

		$this->in_the_loop = false;

		return false;

	}
 

	function rewind_posts() {

		$this->current_post = -1;

		if ($this->post_count > 0) {

			$this->post = $this->posts[0];

		}

	}

    

	function &query($query) {

		$this->parse_query($query);

		return $this->get_posts();

	}
 

	function get_queried_object() {

		if (isset($this->queried_object)) {

			return $this->queried_object;

		}
 

		$this->queried_object = NULL;

		$this->queried_object_id = 0;
 

		if ($this->is_category) {

			$cat = $this->get('cat');

			$category = &get_category($cat);

			$this->queried_object = &$category;

			$this->queried_object_id = $cat;

		} else if ($this->is_single) {

			$this->queried_object = $this->post;

			$this->queried_object_id = $this->post->ID;

		} else if ($this->is_page) {

			$this->queried_object = $this->post;

			$this->queried_object_id = $this->post->ID;

		} else if ($this->is_author) {

			$author_id = $this->get('author');

			$author = get_userdata($author_id);

			$this->queried_object = $author;

			$this->queried_object_id = $author_id;

		}
 

		return $this->queried_object;

	}
 

	function get_queried_object_id() {

		$this->get_queried_object();
 

		if (isset($this->queried_object_id)) {

			return $this->queried_object_id;

		}
 

		return 0;

	}
 

	function WP_Query ($query = '') {

		if (! empty($query)) {

			$this->query($query);

		}

	}

}
 

class retrospam_mgr {

	var $spam_words;

	var $comments_list;

	var $found_comments;
 

	function retrospam_mgr() {

		global $wpdb;
 

		$list = explode("\n", get_settings('moderation_keys') );

		$list = array_unique( $list );

		$this->spam_words = $list;
 

		$this->comment_list = $wpdb->get_results("SELECT comment_ID AS ID, comment_content AS text, comment_approved AS approved, comment_author_url AS url, comment_author_ip AS ip, comment_author_email AS email FROM $wpdb->comments ORDER BY comment_ID ASC");

	}	// End of class constructor
 

	function move_spam( $id_list ) {

		global $wpdb;

		$cnt = 0;

		$id_list = explode( ',', $id_list );
 

		foreach ( $id_list as $comment ) {

			if ( $wpdb->query("update $wpdb->comments set comment_approved = '0' where comment_ID = '$comment'") ) {

				$cnt++;

			}

		}

		echo "<div class='updated'><p>$cnt comment";

		if ($cnt != 1 ) echo "s";

		echo " moved to the moderation queue.</p></div>\n";

	}	// End function move_spam
 

	function find_spam() {

		$in_queue = 0;
 

		foreach( $this->comment_list as $comment ) {

			if( $comment->approved == 1 ) {

				foreach( $this->spam_words as $word ) {

					$word = trim($word);

					if ( empty( $word ) )

						continue;

					$fulltext = strtolower($comment->email.' '.$comment->url.' '.$comment->ip.' '.$comment->text);

					if( strpos( $fulltext, strtolower($word) ) != FALSE ) {

						$this->found_comments[] = $comment->ID;

						break;

					}

				}

			} else {

				$in_queue++;

			}

		}

		return array( 'found' => $this->found_comments, 'in_queue' => $in_queue );

	}	// End function find_spam
 

	function display_edit_form( $counters ) {

		$numfound = count($counters[found]);

		$numqueue = $counters[in_queue];
 

		$body = '<p>' . sprintf(__('Suspected spam comments: <strong>%s</strong>'), $numfound) . '</p>';
 

		if ( count($counters[found]) > 0 ) {

			$id_list = implode( ',', $counters[found] );

			$body .= '<p><a href="options-discussion.php?action=retrospam&amp;move=true&amp;ids='.$id_list.'">'. __('Move suspect comments to moderation queue &raquo;') . '</a></p>';
 

		}

		$head = '<div class="wrap"><h2>' . __('Check Comments Results:') . '</h2>';
 

		$foot .= '<p><a href="options-discussion.php">' . __('&laquo; Return to Discussion Options page.') . '</a></p></div>';

		

		return $head . $body . $foot;

	} 	// End function display_edit_form
 

}
 

class WP_Rewrite {

	var $permalink_structure;

	var $category_base;

	var $category_structure;

	var $author_base = 'author';

	var $author_structure;

	var $date_structure;

	var $page_structure;

	var $search_base = 'search';

	var $search_structure;

	var $comments_base = 'comments';

	var $feed_base = 'feed';

	var $comments_feed_structure;

	var $feed_structure;

	var $front;

	var $root = '';

	var $index = 'index.php';

	var $matches = '';

	var $rules;

	var $use_verbose_rules = false;

	var $rewritecode = 

		array(

					'%year%',

					'%monthnum%',

					'%day%',

					'%hour%',

					'%minute%',

					'%second%',

					'%postname%',

					'%post_id%',

					'%category%',

					'%author%',

					'%pagename%',

					'%search%'

					);
 

	var $rewritereplace = 

		array(

					'([0-9]{4})',

					'([0-9]{1,2})',

					'([0-9]{1,2})',

					'([0-9]{1,2})',

					'([0-9]{1,2})',

					'([0-9]{1,2})',

					'([^/]+)',

					'([0-9]+)',

					'(.+?)',

					'([^/]+)',

					'([^/]+)',

					'(.+)'

					);
 

	var $queryreplace = 

		array (

					'year=',

					'monthnum=',

					'day=',

					'hour=',

					'minute=',

					'second=',

					'name=',

					'p=',

					'category_name=',

					'author_name=',

					'pagename=',

					's='

					);
 

	var $feeds = array ('feed', 'rdf', 'rss', 'rss2', 'atom');
 

	function using_permalinks() {

		if (empty($this->permalink_structure))

			return false;

		else

			return true;

	}					
 

	function using_index_permalinks() {

		if (empty($this->permalink_structure)) {

			return false;

		}
 

		// If the index is not in the permalink, we're using mod_rewrite.

		if (preg_match('#^/*' . $this->index . '#', $this->permalink_structure)) {

			return true;

		}

    

		return false;

	}
 

	function using_mod_rewrite_permalinks() {

		if ( $this->using_permalinks() && ! $this->using_index_permalinks())

			return true;

		else

			return false;

	}					
 

	function preg_index($number) {

		$match_prefix = '$';

		$match_suffix = '';
 

		if (! empty($this->matches)) {

			$match_prefix = '$' . $this->matches . '['; 

			$match_suffix = ']';

		}        
 

		return "$match_prefix$number$match_suffix";        

	}
 

	function page_rewrite_rules() {

		$uris = get_settings('page_uris');
 

		$rewrite_rules = array();

		$page_structure = $this->get_page_permastruct();

		if( is_array( $uris ) )

			{

				foreach ($uris as $uri => $pagename) {

					$this->add_rewrite_tag('%pagename%', "($uri)", 'pagename=');

					$rewrite_rules += $this->generate_rewrite_rules($page_structure);

				}

			}
 

		return $rewrite_rules;

	}
 

	function get_date_permastruct() {

		if (isset($this->date_structure)) {

			return $this->date_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->date_structure = '';

			return false;

		}

		

		// The date permalink must have year, month, and day separated by slashes.

		$endians = array('%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%');
 

		$this->date_structure = '';

		$date_endian = '';
 

		foreach ($endians as $endian) {

			if (false !== strpos($this->permalink_structure, $endian)) {

				$date_endian= $endian;

				break;

			}

		} 
 

		if ( empty($date_endian) )

			$date_endian = '%year%/%monthnum%/%day%';
 

		// Do not allow the date tags and %post_id% to overlap in the permalink

		// structure. If they do, move the date tags to $front/date/.  

		$front = $this->front;

		preg_match_all('/%.+?%/', $this->permalink_structure, $tokens);

		$tok_index = 1;

		foreach ($tokens[0] as $token) {

			if ( ($token == '%post_id%') && ($tok_index <= 3) ) {

				$front = $front . 'date/';

				break;

			}

		}
 

		$this->date_structure = $front . $date_endian;
 

		return $this->date_structure;

	}
 

	function get_year_permastruct() {

		$structure = $this->get_date_permastruct($this->permalink_structure);
 

		if (empty($structure)) {

			return false;

		}
 

		$structure = str_replace('%monthnum%', '', $structure);

		$structure = str_replace('%day%', '', $structure);
 

		$structure = preg_replace('#/+#', '/', $structure);
 

		return $structure;

	}
 

	function get_month_permastruct() {

		$structure = $this->get_date_permastruct($this->permalink_structure);
 

		if (empty($structure)) {

			return false;

		}
 

		$structure = str_replace('%day%', '', $structure);
 

		$structure = preg_replace('#/+#', '/', $structure);
 

		return $structure;

	}
 

	function get_day_permastruct() {

		return $this->get_date_permastruct($this->permalink_structure);

	}
 

	function get_category_permastruct() {

		if (isset($this->category_structure)) {

			return $this->category_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->category_structure = '';

			return false;

		}
 

		if (empty($this->category_base))

			$this->category_structure = $this->front . 'category/';

		else

			$this->category_structure = $this->category_base . '/';
 

		$this->category_structure .= '%category%';

		

		return $this->category_structure;

	}
 

	function get_author_permastruct() {

		if (isset($this->author_structure)) {

			return $this->author_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->author_structure = '';

			return false;

		}
 

		$this->author_structure = $this->front . $this->author_base . '/%author%';
 

		return $this->author_structure;

	}
 

	function get_search_permastruct() {

		if (isset($this->search_structure)) {

			return $this->search_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->search_structure = '';

			return false;

		}
 

		$this->search_structure = $this->root . $this->search_base . '/%search%';
 

		return $this->search_structure;

	}
 

	function get_page_permastruct() {

		if (isset($this->page_structure)) {

			return $this->page_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->page_structure = '';

			return false;

		}
 

		$this->page_structure = $this->root . '%pagename%';
 

		return $this->page_structure;

	}
 

	function get_feed_permastruct() {

		if (isset($this->feed_structure)) {

			return $this->feed_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->feed_structure = '';

			return false;

		}
 

		$this->feed_structure = $this->root . $this->feed_base . '/%feed%';
 

		return $this->feed_structure;

	}
 

	function get_comment_feed_permastruct() {

		if (isset($this->comment_feed_structure)) {

			return $this->comment_feed_structure;

		}
 

		if (empty($this->permalink_structure)) {

			$this->comment_feed_structure = '';

			return false;

		}
 

		$this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%';
 

		return $this->comment_feed_structure;

	}
 

	function add_rewrite_tag($tag, $pattern, $query) {

		// If the tag already exists, replace the existing pattern and query for

		// that tag, otherwise add the new tag, pattern, and query to the end of

		// the arrays.

		$position = array_search($tag, $this->rewritecode);		

		if (FALSE !== $position && NULL !== $position) {

			$this->rewritereplace[$position] = $pattern;

			$this->queryreplace[$position] = $query;			

		} else {

			$this->rewritecode[] = $tag;

			$this->rewritereplace[] = $pattern;

			$this->queryreplace[] = $query;

		}

	}
 

	function generate_rewrite_rules($permalink_structure, $page = true, $feed = true, $forcomments = false, $walk_dirs = true) {

		$feedregex2 = '';

		foreach ($this->feeds as $feed_name) {

			$feedregex2 .= $feed_name . '|';

		}

		$feedregex2 = '(' . trim($feedregex2, '|') .  ')/?$';

		$feedregex = $this->feed_base  . '/' . $feedregex2;
 

		$trackbackregex = 'trackback/?$';

		$pageregex = 'page/?([0-9]{1,})/?$';

		

		$front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));

		preg_match_all('/%.+?%/', $permalink_structure, $tokens);
 

		$num_tokens = count($tokens[0]);
 

		$index = $this->index;

		$feedindex = $index;

		$trackbackindex = $index;

		for ($i = 0; $i < $num_tokens; ++$i) {

			if (0 < $i) {

				$queries[$i] = $queries[$i - 1] . '&';

			}

             

			$query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1);

			$queries[$i] .= $query_token;

		}
 

		$structure = $permalink_structure;

		if ($front != '/') {

			$structure = str_replace($front, '', $structure);

		}

		$structure = trim($structure, '/');

		if ($walk_dirs) {

			$dirs = explode('/', $structure);

		} else {

			$dirs[] = $structure;

		}

		$num_dirs = count($dirs);
 

		$front = preg_replace('|^/+|', '', $front);
 

		$post_rewrite = array();

		$struct = $front;

		for ($j = 0; $j < $num_dirs; ++$j) {

			$struct .= $dirs[$j] . '/';

			$struct = ltrim($struct, '/');

			$match = str_replace($this->rewritecode, $this->rewritereplace, $struct);

			$num_toks = preg_match_all('/%.+?%/', $struct, $toks);

			$query = $queries[$num_toks - 1];
 

			$pagematch = $match . $pageregex;

			$pagequery = $index . '?' . $query . '&paged=' . $this->preg_index($num_toks + 1);
 

			$feedmatch = $match . $feedregex;

			$feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1);
 

			$feedmatch2 = $match . $feedregex2;

			$feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1);
 

			if ($forcomments) {

				$feedquery .= '&withcomments=1';

				$feedquery2 .= '&withcomments=1';

			}
 

			$rewrite = array();

			if ($feed) 

				$rewrite = array($feedmatch => $feedquery, $feedmatch2 => $feedquery2);

			if ($page)

				$rewrite = $rewrite + array($pagematch => $pagequery);
 

			if ($num_toks) {

				$post = 0;

				if (strstr($struct, '%postname%') || strstr($struct, '%post_id%')

						|| strstr($struct, '%pagename%')

						|| (strstr($struct, '%year%') &&  strstr($struct, '%monthnum%') && strstr($struct, '%day%') && strstr($struct, '%hour%') && strstr($struct, '%minute') && strstr($struct, '%second%'))) {

					$post = 1;

					$trackbackmatch = $match . $trackbackregex;

					$trackbackquery = $trackbackindex . '?' . $query . '&tb=1';

					$match = rtrim($match, '/');

					$submatchbase = str_replace(array('(',')'),'',$match);

					$sub1 = $submatchbase . '/([^/]+)/';

					$sub1tb = $sub1 . $trackbackregex;

					$sub1feed = $sub1 . $feedregex;

					$sub1feed2 = $sub1 . $feedregex2;

					$sub1 .= '?$';

					$sub2 = $submatchbase . '/attachment/([^/]+)/';

					$sub2tb = $sub2 . $trackbackregex;

					$sub2feed = $sub2 . $feedregex;

					$sub2feed2 = $sub2 . $feedregex2;

					$sub2 .= '?$';

					$subquery = $index . '?attachment=' . $this->preg_index(1);

					$subtbquery = $subquery . '&tb=1';

					$subfeedquery = $subquery . '&feed=' . $this->preg_index(2);

					$match = $match . '(/[0-9]+)?/?$';

					$query = $index . '?' . $query . '&page=' . $this->preg_index($num_toks + 1);

				} else {

					$match .= '?$';

					$query = $index . '?' . $query;

				}

				        

				$rewrite = $rewrite + array($match => $query);
 

				if ($post) {

					$rewrite = array($trackbackmatch => $trackbackquery) + $rewrite +

						array($sub1 => $subquery, $sub1tb => $subtbquery, $sub1feed => $subfeedquery, $sub1feed2 => $subfeedquery) +

						array($sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery);

				}

			}
 

			$post_rewrite = $rewrite + $post_rewrite;

		}
 

		return $post_rewrite;

	}
 

	function generate_rewrite_rule($permalink_structure, $walk_dirs = false) {

		return $this->generate_rewrite_rules($permalink_structure, false, false, false, $walk_dirs);

	}
 

	/* rewrite_rules

	 * Construct rewrite matches and queries from permalink structure.

	 * Returns an associate array of matches and queries.

	 */

	function rewrite_rules() {

		$rewrite = array();
 

		if (empty($this->permalink_structure)) {

			return $rewrite;

		}
 

		// Post

		$post_rewrite = $this->generate_rewrite_rules($this->permalink_structure);

		$post_rewrite = apply_filters('post_rewrite_rules', $post_rewrite);
 

		// Date

		$date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct());

		$date_rewrite = apply_filters('date_rewrite_rules', $date_rewrite);

		

		// Root

		$root_rewrite = $this->generate_rewrite_rules($this->root . '/');

		$root_rewrite = apply_filters('root_rewrite_rules', $root_rewrite);
 

		// Comments

		$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, true, true, true);

		$comments_rewrite = apply_filters('comments_rewrite_rules', $comments_rewrite);
 

		// Search

		$search_structure = $this->get_search_permastruct();

		$search_rewrite = $this->generate_rewrite_rules($search_structure);

		$search_rewrite = apply_filters('search_rewrite_rules', $search_rewrite);
 

		// Categories

		$category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct());

		$category_rewrite = apply_filters('category_rewrite_rules', $category_rewrite);
 

		// Authors

		$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct());

		$author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);
 

		// Pages

		$page_rewrite = $this->page_rewrite_rules();

		$page_rewrite = apply_filters('page_rewrite_rules', $page_rewrite);
 

		// Put them together.

		$this->rules = $page_rewrite + $root_rewrite + $comments_rewrite + $search_rewrite + $category_rewrite + $author_rewrite + $date_rewrite + $post_rewrite;
 

		do_action('generate_rewrite_rules', array(&$this));

		$this->rules = apply_filters('rewrite_rules_array', $this->rules);
 

		return $this->rules;

	}
 

	function wp_rewrite_rules() {

		$this->matches = 'matches';

		return $this->rewrite_rules();

	}
 

	function mod_rewrite_rules() {

		if ( ! $this->using_permalinks()) {

			return '';

		}
 

		$site_root = parse_url(get_settings('siteurl'));

		$site_root = trailingslashit($site_root['path']);
 

		$home_root = parse_url(get_settings('home'));

		$home_root = trailingslashit($home_root['path']);

    

		$rules = "<IfModule mod_rewrite.c>\n";

		$rules .= "RewriteEngine On\n";

		$rules .= "RewriteBase $home_root\n";
 

		if ($this->use_verbose_rules) {

			$this->matches = '';

			$rewrite = $this->rewrite_rules();

			$num_rules = count($rewrite);

			$rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .

				"RewriteCond %{REQUEST_FILENAME} -d\n" .

				"RewriteRule ^.*$ - [S=$num_rules]\n";

		

			foreach ($rewrite as $match => $query) {

				// Apache 1.3 does not support the reluctant (non-greedy) modifier.

				$match = str_replace('.+?', '.+', $match);
 

				// If the match is unanchored and greedy, prepend rewrite conditions

				// to avoid infinite redirects and eclipsing of real files.

				if ($match == '(.+)/?$' || $match == '([^/]+)/?$' ) {

					//nada.

				}

			

				if (strstr($query, $this->index)) {

					$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";

				} else {

					$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";

				}

			}

		} else {

			$rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" .

				"RewriteCond %{REQUEST_FILENAME} !-d\n" .

				"RewriteRule . {$home_root}{$this->index}\n";

		}
 

		$rules .= "</IfModule>\n";
 

		$rules = apply_filters('mod_rewrite_rules', $rules);

		$rules = apply_filters('rewrite_rules', $rules);  // Deprecated
 

		return $rules;

	}
 

	function init() {

		$this->permalink_structure = get_settings('permalink_structure');

		$this->front = substr($this->permalink_structure, 0, strpos($this->permalink_structure, '%'));		

		$this->root = '';

		if ($this->using_index_permalinks()) {

			$this->root = $this->index . '/';

		}

		$this->category_base = get_settings('category_base');

		unset($this->category_structure);

		unset($this->author_structure);

		unset($this->date_structure);

		unset($this->page_structure);

		unset($this->search_structure);

		unset($this->feed_structure);

		unset($this->comment_feed_structure);

	}
 

	function set_permalink_structure($permalink_structure) {

		if ($permalink_structure != $this->permalink_structure) {

			update_option('permalink_structure', $permalink_structure);

			$this->init();

		}

	}
 

	function set_category_base($category_base) {

		if ($category_base != $this->category_base) {

			update_option('category_base', $category_base);

			$this->init();

		}

	}
 

	function WP_Rewrite() {

		$this->init();

	}

}
 

class WP {

	var $public_query_vars = array('option','Itemid','m', 'p', 'posts', 'w', 'cat', 'withcomments', 's', 'search', 'exact', 'sentence', 'debug', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id');
 

	var $private_query_vars = array('posts_per_page', 'posts_per_archive_page', 'what_to_show', 'showposts', 'nopaging', 'show_post_type');
 

	var $query_vars;

	var $query_string;

	var $request;

	var $matched_rule;

	var $matched_query;

	var $did_permalink = false;
 

	function parse_request($extra_query_vars = '') {

		global $wp_rewrite;
 

		$this->query_vars = array();
 

		if (! empty($extra_query_vars))

			parse_str($extra_query_vars, $extra_query_vars);

		else

			$extra_query_vars = array();
 

		// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.
 

		// Fetch the rewrite rules.

		$rewrite = $wp_rewrite->wp_rewrite_rules();
 

		if (! empty($rewrite)) {

			// If we match a rewrite rule, this will be cleared.

			$error = '404';

			$this->did_permalink = true;
 

			$pathinfo = $_SERVER['PATH_INFO'];

			$pathinfo_array = explode('?', $pathinfo);

			$pathinfo = $pathinfo_array[0];

			$req_uri = $_SERVER['REQUEST_URI'];

			$req_uri_array = explode('?', $req_uri);

			$req_uri = $req_uri_array[0];

			$self = $_SERVER['PHP_SELF'];

			$home_path = parse_url(get_settings('home'));

			$home_path = $home_path['path'];
 

			// Trim path info from the end and the leading home path from the

			// front.  For path info requests, this leaves us with the requesting

			// filename, if any.  For 404 requests, this leaves us with the

			// requested permalink.	

			$req_uri = str_replace($pathinfo, '', $req_uri);

			$req_uri = str_replace($home_path, '', $req_uri);

			$req_uri = trim($req_uri, '/');

			$pathinfo = str_replace($home_path, '', $pathinfo);

			$pathinfo = trim($pathinfo, '/');

			$self = str_replace($home_path, '', $self);

			$self = trim($self, '/');
 

			// The requested permalink is in $pathinfo for path info requests and

			//  $req_uri for other requests.

			if ( ! empty($pathinfo) && ($wp_rewrite->index != $pathinfo) ) {

				$request = $pathinfo;

			} else {

				// If the request uri is the index, blank it out so that we don't try to match it against a rule.

				if ( $req_uri == $wp_rewrite->index )

					$req_uri = '';

				$request = $req_uri;

			}
 

			$this->request = $request;
 

			// Look for matches.

			$request_match = $request;

			foreach ($rewrite as $match => $query) {

				// If the requesting file is the anchor of the match, prepend it

				// to the path info.

				if ((! empty($req_uri)) && (strpos($match, $req_uri) === 0) && ($req_uri != $request)) {

					$request_match = $req_uri . '/' . $request;

				}
 

				if (preg_match("!^$match!", $request_match, $matches) ||

					preg_match("!^$match!", urldecode($request_match), $matches)) {

					// Got a match.

					$this->matched_rule = $match;
 

					// Trim the query of everything up to the '?'.

					$query = preg_replace("!^.+\?!", '', $query);
 

					// Substitute the substring matches into the query.

					eval("\$query = \"$query\";");

					$this->matched_query = $query;
 

					// Parse the query.

					parse_str($query, $query_vars);
 

					// If we're processing a 404 request, clear the error var

					// since we found something.

					if (isset($_GET['error']))

						unset($_GET['error']);
 

					if (isset($error))

						unset($error);
 

					break;

				}

			}
 

			// If req_uri is empty or if it is a request for ourself, unset error.

			if ( empty($request) || $req_uri == $self || strstr($_SERVER['PHP_SELF'], 'wp-admin/') ) {

				if (isset($_GET['error']))

					unset($_GET['error']);
 

				if (isset($error))

					unset($error);

					

				if ( isset($query_vars) && strstr($_SERVER['PHP_SELF'], 'wp-admin/') )

					unset($query_vars);

					

				$this->did_permalink = false;

			}

		}
 

		$this->public_query_vars = apply_filters('query_vars', $this->public_query_vars);
 

		for ($i=0; $i<count($this->public_query_vars); $i += 1) {

			$wpvar = $this->public_query_vars[$i];

			if (isset($extra_query_vars[$wpvar]))

				$this->query_vars[$wpvar] = $extra_query_vars[$wpvar];

			elseif (isset($GLOBALS[$wpvar]))

				$this->query_vars[$wpvar] = $GLOBALS[$wpvar];

			elseif (!empty($_POST[$wpvar]))

				$this->query_vars[$wpvar] = $_POST[$wpvar];

			elseif (!empty($_GET[$wpvar]))

				$this->query_vars[$wpvar] = $_GET[$wpvar];

			elseif (!empty($query_vars[$wpvar]))

				$this->query_vars[$wpvar] = $query_vars[$wpvar];

			else

				$this->query_vars[$wpvar] = '';

		}
 

		if ( isset($error) )

			$this->query_vars['error'] = $error;

	}
 

	function send_headers() {

		global $current_user;

		@header('X-Pingback: '. get_bloginfo('pingback_url'));

		if ( is_user_logged_in() )

			nocache_headers();

		if ( !empty($this->query_vars['error']) && '404' == $this->query_vars['error'] ) {

			status_header( 404 );

		} else if ( empty($this->query_vars['feed']) ) {

			@header('Content-type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));

		} else {

			// We're showing a feed, so WP is indeed the only thing that last changed

			if ( $this->query_vars['withcomments'] )

				$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastcommentmodified('GMT'), 0).' GMT';

			else 

				$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' GMT';

			$wp_etag = '"' . md5($wp_last_modified) . '"';

			@header("Last-Modified: $wp_last_modified");

			@header("ETag: $wp_etag");
 

			// Support for Conditional GET

			if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) $client_etag = stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);

			else $client_etag = false;
 

			$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE']);

			// If string is empty, return 0. If not, attempt to parse into a timestamp

			$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;
 

			// Make a timestamp for our most recent modification...	

			$wp_modified_timestamp = strtotime($wp_last_modified);
 

			if ( ($client_last_modified && $client_etag) ?

					 (($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) :

					 (($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) {

				status_header( 304 );

				exit;

			}

		}

	}
 

	function build_query_string() {

		$this->query_string = '';
 

		foreach ($this->public_query_vars as $wpvar) {

			if (isset($this->query_vars[$wpvar]) && '' != $this->query_vars[$wpvar]) {

				$this->query_string .= (strlen($this->query_string) < 1) ? '' : '&';

				$this->query_string .= $wpvar . '=' . rawurlencode($this->query_vars[$wpvar]);

			}

		}
 

		foreach ($this->private_query_vars as $wpvar) {

			if (isset($GLOBALS[$wpvar]) && '' != $GLOBALS[$wpvar]) {

				$this->query_string .= (strlen($this->query_string) < 1) ? '' : '&';

				$this->query_string .= $wpvar . '=' . rawurlencode($GLOBALS[$wpvar]);

			}

		}
 

		$this->query_string = apply_filters('query_string', $this->query_string);

	}
 

	function register_globals() {

		global $wp_query;

		// Extract updated query vars back into global namespace.

		foreach ($wp_query->query_vars as $key => $value) {

			$GLOBALS[$key] = $value;

		}
 

		$GLOBALS['query_string'] = & $this->query_string;

		$GLOBALS['posts'] = & $wp_query->posts;

		$GLOBALS['post'] = & $wp_query->post;
 

		if ( is_single() || is_page() ) {

			$GLOBALS['more'] = 1;

			$GLOBALS['single'] = 1;

		}

	}
 

	function init() {

		get_currentuserinfo();

	}
 

	function query_posts() {

		$this->build_query_string();

		query_posts($this->query_string);

 	}
 

	function handle_404() {

		global $wp_query;

		// Issue a 404 if a permalink request doesn't match any posts.  Don't

		// issue a 404 if one was already issued, if the request was a search,

		// or if the request was a regular query string request rather than a

		// permalink request.

		if ( (0 == count($wp_query->posts)) && !is_404() && !is_category() && !is_search() && ( $this->did_permalink || (!empty($_SERVER['QUERY_STRING']) && (false === strpos($_SERVER['REQUEST_URI'], '?'))) ) ) {

			$wp_query->set_404();

			status_header( 404 );

		}	elseif( is_404() != true ) {

			status_header( 200 );

		}

	}
 

	function main($query_args = '') {

		$this->init();

		$this->parse_request($query_args);

		$this->send_headers();

		$this->query_posts();

		$this->handle_404();

		$this->register_globals();

	}
 

	function WP() {

		// Empty.

	}

}
 

?>

Open in new window

0
 
LVL 3

Expert Comment

by:iserko
ID: 24126608
Hmm didn't even check that. I assumed everything was ok since it opened fine for me in Firefox. The status sent back is indeed 404 (Not Found), but the content sent back is fine.

If you visit the site directly using the 1st link, the status is 200.

It would be useful to see all RewriteRule statements with /blog in them.
0
 

Author Comment

by:rsokhi
ID: 24126639
Alright, if there is an issue, it's probably in this file.  This is a mambot created by a guy named lmeyer, and the mambot is called FFSEF light.  This mambot is the missing link between SH404SEF and Wordpresses own SEF links.  Turning the mambot on allows links that Wordpress creates is actually linked to the correct article (based on Itemid i think).  ANywho, if you search the code for "blog", that's where "blog" is entered into the rewritten link, i think.
<?php
 

defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
 
 
 

$_MAMBOTS->registerFunction( 'onStart', 'botffsef_fool' );
 

$_MAMBOTS->registerFunction( 'onAfterStart', 'botffsef_revert' );
 
 
 
 

function botffsef_fool() {

    //begin specific to ffsef-light
 

    global $mosConfig_live_site;

    $GLOBALS['ffsef_config']['installdir'] = strstr(substr($mosConfig_live_site,8),'/');
 

    $GLOBALS['ffsef_rules'][] = array('matchtype' => 'startwith', 'component' => 'com_mojo', 'matchtext' => '/blog');
 

    //end specific to ffsef-light

    global $mosConfig_debug;
 

    $GLOBALS['ffsef_cache']['REQUEST_URI']=$_SERVER['REQUEST_URI'];
 

    $GLOBALS['ffsef_matched'] = false;
 

    if ($mosConfig_debug){
 

        var_dump($GLOBALS['ffsef_config']);
 

        var_dump($GLOBALS['ffsef_rules']);
 

        ffsef_debug('Before onStart processing');
 

    }
 

    foreach ($GLOBALS['ffsef_rules'] as $ffsef_rule){
 

        switch ($ffsef_rule['matchtype']){
 

            case 'startwith':
 

                $str = $GLOBALS['ffsef_config']['installdir'].$ffsef_rule['matchtext'];
 

                if (substr($_SERVER['REQUEST_URI'],0,strlen($str)) == $str){
 

                    ffsef_rewrite($ffsef_rule['component']);

                    $GLOBALS['ffsef_matched'] = true;
 

                }
 

                break;
 

             default:
 

        }
 

    }

    if($GLOBALS['ffsef_matched'])

        ffsef_request_vars();
 

    if ($mosConfig_debug){
 

        ffsef_debug('After onStart processing');
 

        ob_flush();
 

    }
 

}
 

function botffsef_revert() {
 

    global $mosConfig_debug;
 

    if($GLOBALS['ffsef_matched']){

        if ($mosConfig_debug){
 

            ffsef_debug('Before onAfterStart processing');
 

        }
 

        $_SERVER['REQUEST_URI'] = $GLOBALS['ffsef_cache']['REQUEST_URI'];
 

    
 

        if ($mosConfig_debug){
 

            ffsef_debug('After onAfterStart processing');
 

            ob_flush();
 

        }

    }
 

}
 

function ffsef_rewrite ($component){
 

    global $mosConfig_sef, $database;

    $database->setQuery("SELECT id FROM #__menu WHERE link='index.php?option=com_mojo' AND published='1'");

    $Itemid = $database->loadResult();

    $parts = $mosConfig_sef ? array('/component/','/',',') : array('index.php?','&','=');

    $_SERVER['REQUEST_URI'] = "{$GLOBALS['ffsef_config']['installdir']}{$parts[0]}option{$parts[2]}$component"

        .($Itemid ? "{$parts[1]}Itemid{$parts[2]}$Itemid" : '');

}
 

function ffsef_request_vars(){
 

    $request = parse_url($_SERVER['REQUEST_URI']);
 

    $_SERVER['QUERY_STRING'] = $request['query'];
 

    parse_str($_SERVER['QUERY_STRING'], $vars);
 

    foreach ($vars as $var => $value){
 

        $_GET[$var] = $value;
 

        if(!isset($_POST[$var]) && !isset($_COOKIE[$var]) && !isset($_SESSION[$var])){
 

            $_REQUEST[$var] = $value;
 

        }
 

    }
 

}
 

function ffsef_debug($text){
 

        echo "<pre>$text<br />";
 

        var_dump($_SERVER['REQUEST_URI']);
 

        echo "</pre>";
 

}
 

?>

Open in new window

0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 
LVL 3

Expert Comment

by:iserko
ID: 24126641
Must be this part

if ( (0 == count($wp_query->posts)) && !is_404() && !is_category() && !is_search() && ( $this->did_permalink || (!empty($_SERVER['QUERY_STRING']) && (false === strpos($_SERVER['REQUEST_URI'], '?'))) ) ) {
                  $wp_query->set_404();
                  status_header( 404 );
            }      elseif( is_404() != true ) {
                  status_header( 200 );
            }

Try changing line 1661 in that file:

From:
if ( (0 == count($wp_query->posts)) && !is_404() && !is_category() && !is_search() && ( $this->did_permalink || (!empty($_SERVER['QUERY_STRING']) && (false === strpos($_SERVER['REQUEST_URI'], '?'))) ) ) {
To:
if ( (0 == count($wp_query->posts)) && !is_404() && !is_category() && !is_search() ) {

0
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24126666
Note that /blogNonExisting/ returns the same page, but /NonExisting/ heas a "real" 404 page. It seems any url starting with "blog" gets a 404 and a "normal" page, probably confusing some browsers.
0
 
LVL 3

Expert Comment

by:iserko
ID: 24126671
Can I shoot myself now or later. Talk about complicating things into oblivion.

FFSEF light does indeed handle the rewriting, but I don't see any mention of changing the status code. I think the only script that does that is the one you posted earlier.
Try my test code fix and see if that helps.
0
 

Author Comment

by:rsokhi
ID: 24126695
@cxr: You're right.

@jserko: I tried it and it's as if nothing happened...at least nothing noticeable yet.  Plus I still get the 404 error.

Actually now that I think about it...FFSEF light builds on SH404SEF so I'd say between that code and some files in the SH404SEF component (which I have not attached), something happens.  The first file is from mojoblog/Wordpress, and probably isn't the culprit.  But at this point...who knows.

That's why I was thinking of a mindless workaround.  How can a page return as 404 yet still show the page??  What is the browser doing?
0
 

Author Comment

by:rsokhi
ID: 24126700
And yes...I've wanted to shoot myself for some time.  I guess I should be glad everything's working...but then again...this is our livelihood, and the blog was supposed to be the tool that helped our search rankings...so the fact that the blog is not indexed by google is probably the worst page that could have happened to.  

I'll keep trying though...
0
 
LVL 3

Expert Comment

by:iserko
ID: 24126716
Well the thing is .... returning status code 404 and a response with proper HTML is valid I believe. You have websites with custom error pages where you get a 404 error with a nice graphic and everything.

Unfortunately I've never tampered with Joomla/SH404SEF/FFSEF/mojoblog/Wordpress much.

And yes you are most likely correct it is somewhere in between those plugins.

All I can say is good luck. Asking the Joomla forums or other forums where they use SH404SEF and FFSEF might prove more helpful.
0
 

Author Comment

by:rsokhi
ID: 24126776
Alright buddy...thanks.
0
 

Accepted Solution

by:
rsokhi earned 0 total points
ID: 24180995
Guys I figured it out.  It had to do with the settings in mojoblog (or Wordpress sort of).  According to me.yer.com, the maker of FFSEF light, there are very specific terms to put in the mojoblog back-end.  Check out the website for more info.
0
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24182804
rsokhi, while you found the solution yourself, you did get some help, and should award some points to those who helped you. My contribution was minor, but iserko seems to have spent a considerable amount of time trying to help you. Do you really think this was worthless?
0
 

Author Comment

by:rsokhi
ID: 24190308
I'm actually new to the website so I'm not totally sure on how points are supposed to awarded.  That said, I don't think my initial decision was way off base...I don't know if you read the final outcome, but the solution ended up being something COMPLETELY unrelated.  So given that, I figured it was an ok decision.  I did reconsider and will award some points to the both of you for the very informative responses though when I get the chance to get on a computer (on a blackberry right now).    
0
 
LVL 39

Expert Comment

by:Roger Baklund
ID: 24234305
modus_operandi, you obviously ignored the final post from the author... why?

"No reply to request for recommendations."

Was I supposed to reply again, after my initial objection and after the asker said he would award us some points?
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Internet is a big network which is formed by connecting multiple small networks.It is a platform for all the users which are connected to it.Internet act as platform in different fields. Such as: Internet  as a collaboration platform. Internet  as…
Citrix XenApp, Internet Explorer 11 set to Enterprise Mode and using central hosted sites.xml file.
Google currently has a new report that is in beta and coming soon to Webmaster Tool accounts. This Micro Tutorial will highlight new features for Google Webmaster Tools.
Shows how to create a shortcut to site-search Experts Exchange using Google in the Chrome browser. This eliminates the need to type out site:experts-exchange.com whenever you want to search the site. Launch the Search Engine Menu: In chrome, via you…

708 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now