You can decide to manually add each of these pages to the exclude list (admin -> configuration -> Simple SEO URL -> exclude list). Personally I decided to modify the function ssu_params in includes/init_includes/init_ssu.php this way:
Code:
// this function takes the parameters in the query string and turns that to our nice looking link
function ssu_params(&$page, $parameters, $re_calculate_cpath= false){
$parameters = trim($parameters,' ?&');
$cachefile = $this->pc_cache_folder.md5($page.$parameters);
$params = '';
$use_cache = false;
$set_cache = false;
$contains_cpath = (strpos($parameters,'cPath=') !== false);
$contains_products_id = (strpos($parameters,'products_id=') !== false);
$is_product_info_page = in_array($page, $this->products_handlers);
$is_category_page = ($page == 'index' && $contains_cpath);
$both_id = (!$is_product_info_page && !$is_category_page && $contains_cpath && $contains_products_id);
$only_products_id = (!$contains_cpath && $contains_products_id);
if(!empty($parameters)){
// if this contains cPath or products_id lets attempt to use cache
if($contains_cpath || $contains_products_id){
$use_cache = true;
if (($params = @file_get_contents($cachefile)) === false)
$set_cache = true;
}
// process params if we dont use cache or need to reset cache
if(!$use_cache || $set_cache){
// No need for '?'
//$parameters = str_replace('?', '', $parameters);
$parameters = str_replace(array('&','&','=','?'),'/',$parameters);
// clean up
//$parameters = preg_replace('/\/\/+/', '/', $parameters);
$parameters = trim($parameters, '/');
$cPath='';
$products_id='';
// Appending category name and product name into the link
$parameters = explode('/',$parameters);
$param_counter = count($parameters);
// we want to make sure the order of params for product info and category pages
if($is_product_info_page || $both_id)
$params = "%s/%p";
elseif($is_category_page)
$params = "%s";
elseif($only_products_id)
$params = "%p";
for($i=0; $i < $param_counter; $i++){
if($parameters[$i]=='cPath'){
$cPath = $parameters[++$i];
if(!$is_product_info_page && !$is_category_page && !$both_id)
$params .= "/%s";
}
elseif($parameters[$i]=='products_id'){
$products_id = $parameters[++$i];
if(!$is_product_info_page && !$is_category_page && !$only_products_id && !$both_id)
$params .= "/%s";
}
elseif(!empty($parameters[$i]) && !empty($parameters[$i+1])){
$params .= "/".$parameters[$i]."/".$parameters[++$i];
}
else
$i++;
}
// dont trust the info passed to us, always rebuild the cPath in this case
if($is_product_info_page && !empty($products_id)){
$cPath = zen_get_product_path($products_id);
}
elseif(!empty($cPath) && $re_calculate_cpath && !empty($products_id)){
$cPath = zen_get_product_path($products_id);
}
if(!empty($cPath)){
$params = str_replace('%s', $this->get_category_name($cPath), $params);
}
if(!empty($products_id)){
$params = str_replace('%p', $this->get_product_name($products_id), $params);
}
}
}
if($is_product_info_page || $is_category_page)
$page ='';
$params = trim($params, '/');
if($set_cache) $this->_write_to_file($cachefile, trim($params,'/')); // we cache the whole link so that we dont have to recalculate it again
// TODO: change the way we check if the language is already in the link
$params .= (isset($_SESSION['languages_code']) && strpos($params, 'language/') === false && $_SESSION['languages_code'] != DEFAULT_LANGUAGE) ? '/language/' . $_SESSION['languages_code'] : '';
return $params;
}
Thanks to $only_products_id and $both_id, we can process the links referring to pages which are not product or category pages, but whose URL contain category or product identifiers (like tell_a_friend and product_reviews_write).
If you want to use this solution, you can cut and paste the code, overwrite init_ssu.php with the file in attachment, or use the patch with the command "patch -p0 < init_ssu.patch".
Of course this is provided without any warranty and should be tested before using it on your Zen Cart shop (in your case it seems you already use a test shop, though).
I had not proposed yet these modifications as I was not sure everyone met this problem.
To hunt dead or broken links on a website, you can use lynx (lynx -accept_all_cookies -traversal -crawl -realm PATH_TO_YOUR_LOCAL_WEBSITE) or Xenu (wich unfortunately only has a Windows version but it works fine with wine). Of course it is best to use it on your own PC or local network as it consumes A LOT of bandwith.
Hope this helps,
FMB.