只要在设置了cookie或会话参数提供引用之后,URL地址就可以重定向到“主要”URL地址,那么就有可能使用参数化的会员URL地址。本节展示了两个实例。在练习中逐步实现了它们。
这里展示的解决方案有一个共同点,就是当请求包含会员ID的URL地址时,首先将那个会员ID保留在别的什么地方,然后进行301重定向转到那个不使用会员参数的URL地址。例子使用访问者会话来存储会话来存储会员ID,读者也可以试着使用cookie。
1、实例#1
这个例子假定有会员URL地址http://seophp.example.com/Products/SEO-Toolbox-C6/Link-Juice-P31.html?aff_id=987。最终要重定向到的地址是http://seophp.example.com/Products/SEO-Toolbox-C6/Link-Juice-P31.html。
重定向多关键词会员URL地址
(1)打开.htaccess文件并找到重写多关键词产品URL地址的那一行:
RewriteRule ^Products/.*-C([0-9]+)/.*-P([0-9]+)\.html$ /Product.php?category_id=$1&Product_id=$2 [L]
修改这一行,添加以下内容至行末:
RewriteRule ^Products/.*-C([0-9]+)/.*-P([0-9]+)\.html$ /Product.php?category_id=$1&product_id$2%{QUERY_STRING} [L]
(2)修改product.php如下:
<?php
require_once 'include/url_redirect.inc.php';
session_start();
if(isset($_REQUEST['aff_id']))
{
$_SESSION['aff_id']=$_REQUEST['aff_id'];
}
fix_category_product_url();
echo 'You have selected product #'.$_GET['product_id'].' from actegory #'.$_GET['category_id'];
echo '<br><br>You got here through affiliate:';
if(!isset($_SESSION['aff_id']))
{
echo '(no affiliate)';
}else{
echo $_SESSION['aff_id'];
}
(3)现在测试新的脚本。第一个测试是不使用会员ID加载产品页面http://seophp.example.com/Products/SEO_Toolbox-C6/Link-Juice-P31.html。
(4)现在添加会员ID。加载http://seophp.example.com/Products/SEO-Toolbox-C6/Link-Juice-P31.html?aff_id=987。期待正确重定向到主产品页面。并且仍然能保留会员ID。
URL地址不再包括任何会员ID,但页面仍保留了会员ID。这个效果成功实现了,并且只添加了几行PHP代码!再次分析所有的事情,以下是mod_rewrite规则:
RewriteRule ^Products/.*-C([0-9]+)/.*-P([0-9]+)\.html$ /product.php?category_id=$1&product_id=$2&%{QUERY_STRING} [L]
参数{QUERY_STRING}是个特殊的变量,它由存储了URL地址中查询字符串的mod_rewrite提供。PewriteRule仍然和以前一样,对URL地址进行匹配,但是这次将在重写后的URL地址中附加那些参数。
这样,当product.php被执行,它将访问参数aff_id。仅仅需要添加最少量的代码到product.php中,主要工作是验证在查询字符串中是否在参数aff_id。如果存在,就在用户会话中保存会员ID:
session_start();
if(isset($_REQUEST['aff_id']))
{
$_SESSION['aff_id']=$_REQUEST['aff_id'];
}
重定向本身是由老朋友fix_category_product_url()函数来完成。这个函数验证URL地址是否与生成的产品URL地址相同,如果不相同就完成一个自动的301重定向到“正确的”URL地址;在此情况下,正确的URL地址就是一个不包含aff_id参数的产品URL地址。
fix_category_product_url();
在带会员ID的产品页面第一次被加载时,它将被重定向到那个不包含任何查询字符串参数的“正确”版本。当product.php被重新加载,它将执行代码显示产品细节和会员ID。这次,从会话中读取会员ID:
echo '<br><br>You got here through affiliate:';
if(!isset($_SESSION['aff_id']))
{
echo '(no affiliate)';
}else{
echo $_SESSION['aff_id'];
}