自定义URL重写在PHP中

时间:2017-04-01 10:33:14

标签: mysql url-rewriting

我正在php应用程序中实现基本的URL重写。以下是我遵循的方法:

table 1: rewrite_table (fields as below)

id | original_url | custom_url

此表用于存储原始网址和自定义网址。

我正在检查请求的url是否与任何custom_url匹配,如果是,那么我正在调用控制器和正在保存在original_url字段中的操作

工作正常。现在,重点是如果我再次更改自定义网址然后我想将旧网址保留在网址日志表中,以防任何用户使用该旧网址浏览网页,然后他将重定向到具有301重定向的新网址

我创建了一个新表

Table2: rewrite_table (fields as below)

log_original_url | current_url_id (this belongs to first table id filed)

此表用于存储旧URL,在更新已经在第1个表中的url之前,所有人都可以公开访问该URL。

我很困惑,无法找到任何解决方案来实施第二种方法。

任何人都可以帮我找到解决方案

由于

2 个答案:

答案 0 :(得分:0)

根据您的问题,您似乎在所有情况下都使用original_url。

我的方法是。

从rewritetable1 T1中选择T1.original_url在T2.current_url_id = T1.id上选择左连接rewritetable2 T2      其中T1.custom_url ='用户输入网址'或              T2.log_original_url ='用户输入网址'

因此,如果用户输入旧的自定义网址或新的自定义网址,您将获得要重定向的original_url

答案 1 :(得分:0)

试试这个:

表1:网址(internal_url是唯一的)

id | internal_url | current_alias_id

1 |用户/索引| 3

2 |用户/视图| 4

表2:别名(别名是唯一的)

id | internal_url_id |别名

1 | 1 | /我的/定制/索引/ URL / 1

2 | 1 | /我的/定制/索引/ URL / 2

3 | 1 | /我的/定制/索引/ URL / 3

4 | 2 | /我的/定制/视图/ URL / 1

上面的示例说明了每个内部(在您的术语"原始")url可以有一个或多个别名的情况。其中一个别名总是"当前"或"规范"。访问时,必须将其重写为相应的内部URL,不会发生重定向。内部URL始终通过" current_alias_id"指向其规范别名。领域。访问时,其他别名必须重定向到"规范"同一内部URL的别名。

在示例中,内部网址"用户/索引"有3个别名,其当前(规范)别名是#3,而另外2个是" old"。

内部网址"用户/视图"只有一个别名#4,这也是规范的。

如果我理解正确,可以使用以下伪代码实现所需的行为:

record = SELECT a.*, 
         u.current_alias_id, u.internal_url 
         c.alias AS canonical_alias
         FROM `aliases` a
         INNER JOIN `urls` u ON a.original_url_id = u.id
         INNER JOIN `aliases` c ON u.current_alias_id = c.id
         WHERE a.alias = '$request_url';

// assume we found a record
if (record.id == record.current_alias_id)
    // rewrite to record.internal_url
else 
    // redirect to record.canonical_alias

您是否需要向内部URL#2(用户/视图)添加新别名 - 只需将其添加到别名表中,它将接收id = 5,然后UPDATE urls SET current_alias_id = 5 WHERE urls.id = 2 < / p>

从现在开始,无论谁访问新别名,都会直接重写请求,并且访问旧别名#4的任何人都将被重定向到网址#5。

当然,您应该强制执行每个&#34;内部网址&#34;和每个&#34;别名&#34;是独一无二的,通过设置一个独特的&#34;索引在相应的列上。