2013-08-28 126 views
1

在我的应用程序要实现URL重写,以使链接搜索引擎友好URL重写mod_rewrite的问题

1.http://example.com/item.php?act=view&id=192 
2.http://example.com/feedback.php?id=146 

TO

1.http://example.com/items/itemsname 
2.http://www.example.com/username 

问题

1)我有点糊涂了,虽然,是否需要将我的代码中的所有链接更改为http://example.com/items/itemsname并使用重写将其转换为http://example.com/item.php?act=view&id=192

我可以离开我的代码,因为它是http://example.com/item.php?act=view&id=192,只是重写它转化为http://example.com/items/itemsname(选项2看起来否则更现实没有的.htaccess任何方法都行不通)

2)如何这在Apache和Php中完成?

回答

1

你有几个方法可以做到这一点,我会说,你当前的PHP的最简单的方法是改变你的链接是这样的:

http://example.com/items/id-itemsname 
http://example.com/id-username 

因此,一个真实的例子是这样的:

http://example.com/items/192-Wash-Machine 
http://example.com/feedback/146-Jon-Lin 

然后你就可以很容易地使用这个规则把它转换:

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^items/([0-9]+)-.*$ /item.php?act=view&id=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^feedback/([0-9]+)-.*$ /feedback.php?id=$1 [L] 

通过这种方式,您可以完全忽略标题并仅从其中获取标识并使用当前脚本,同时仍向用户显示标题。

另一种方式是像你提到的,它应该是这样的:

http://example.com/items/itemsname 
http://example.com/feedback/username 

你会那么需要改变你的PHP按名称查找反馈和物品,使他们看起来像这样:

http://example.com/item.php?act=view&name=Wash Machine 
http://example.com/feedback.php?username=Jon Lin 

而且规则是这样的:

Options +FollowSymLinks -MultiViews 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^items/([^/]+)/?$ /item.php?act=view&name=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^feedback/([^/]+)/?$ /feedback.php?username=$1 [L] 
+0

的RewriteCond需要在电子是重写规则我想每个条件的最后,非常感谢您的详细回答! – Athanatos

+0

@Athanatos这是我的坏,这是一个错字,感谢您发现;) – Prix

0

这将帮助你:URL Rewrites and 301 Redirects - How Does It All Work?

就个人而言,我认为正确的做法是改变所有的链接,并使用.htaccess文件来重写这些URL(很明显,你需要将好的名称转换[又名蛞蝓]改写成id后)。我尽量避免重定向,除非它们是100%必要的,事实并非如此。事情是这样的:

的.htaccess:

RewriteRule ^items/([0-9a-zA-Z\-\_].*)$ item.php?act=view&slug=$1 [L] 

关于链接,你可以改变自己手动(我建议),或通过JavaScript,从而使某种用户点击后转换的功能。

1

我有点糊涂了,虽然,我需要在我的代码的所有链接更改为http://example.com/items/itemsname和使用重写翻译成http://example.com/item.php?act=view&id=192

你想这样做,如果你可以的话。这意味着你没有另外一层处理的每个链接被点击

翻译有点含糊不清。例如:

/username - >/feedback.php?id=146

的 “用户名” 我想大概是 “山姆”,但 “ID” 是一个数字。重写模块知道什么都没有关于这个映射,在htaccess文件中什么都不知道用户名如何映射到ID或项目名称如何映射到ID。唯一可以做的是使用在访问此映射的server/vhost配置中定义的RewriteMap

你最好做的就是使用php。将项目和用户名映射到item.phpfeedback.php脚本。让这些脚本根据名字找出id。 有这些脚本检查请求的URI,看看请求是否是直接的PHP文件,而不是SEO寻找的URL,并让他们根据需要重定向。

你想mod_rewrite的做的唯一的事情就是做正向映射:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^item/(.*)$ /item.php?act=view&name=$1 [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond ^(.*)$ /feedback.php?name=$1 [L] 

在这里,你会找到“name”参数,映射那些编号的,您需要,然后继续正常。