在我的应用程序中,我想实现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中完成?
答案 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.php
和feedback.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,在用户点击后制作某种翻译功能。