网址重写mod_rewrite问题

时间:2013-08-28 16:56:39

标签: apache .htaccess mod-rewrite url-rewriting apache2

在我的应用程序中,我想实现URL重写以使链接SEO友好

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

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中完成?

3 个答案:

答案 0 :(得分:1)

  

我有点困惑,但我是否需要将代码中的所有链接更改为http://example.com/items/itemsname并使用重写将其翻译为http://example.com/item.php?act=view&id=192

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

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

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

我假设的“用户名”类似于“sam”,但“id”是一个数字。重写模块知道关于此映射的 nothing ,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”参数,将这些参数映射到您需要的ID,然后正常进行。

答案 1 :(得分: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]

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

另一种方式就像你提到的那样,它看起来像这样:

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]

答案 2 :(得分:0)

这会对您有所帮助:URL Rewrites and 301 Redirects - How Does It All Work?

就个人而言,我认为正确的方法是更改​​所有链接并使用.htaccess文件重写网址(显然你需要在重写后将好名字[a.k.a slug]转换为id)。我试图避免重定向,除非它们是100%必要的,事实并非如此。像这样:

htaccess的:

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

关于链接,你可以手动更改它们(我推荐)或通过JavaScript,在用户点击后制作某种翻译功能。