我正在为我的网站创建一个首页,其中包含单一表单和输入文字,Google风格。它工作正常,但是,我想根据输入生成一个漂亮的URL。比方说,我的输入被称为“id”,并且使用表单的GET方法,以及在提交时定义为“/ go /”的操作,URL将是:
site.com/go/?id=whateverIType
我希望将其更改为
site.com/go/whateverIType
我正在考虑使用Mod Rewrite,但是如果用户在URL中添加了某些内容,例如:
site.com/go/?dontwant=this&id=whateverIType&somemore=trash
我想忽略其他变量而忽略“id”,并重写规则。
完成这项工作的更好方法是什么?提前谢谢!
PS:我正在使用CodeIgniter,也许我可以使用它。我已经有了“go”的控制器。
答案 0 :(得分:1)
我不熟悉CodeIgniter,但您可以尝试以下RewriteRule
RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/go\/
RewriteCond %{QUERY_STRING} id=([^&]*)
RewriteRule (.*) /go/%1? [L,R]
%1
引用上一个RewriteCond
中的regex组,尾随?
将从重定向的URL中删除查询字符串。
希望这有帮助。
答案 1 :(得分:1)
Mod_rewrite使用RegEx支持conditions和rules,因此您可以拥有与?id=XXXX
匹配的规则,该规则会从URL中提取它(保留其他参数) ),并相应地重写了URL。
但是......我认为你不想这样做,因为如果你把URL重写为/go/Some+Search+Query
,你就不能用PHP来解决它,而不用解析手动输出网址。
使用用户输入提供自定义,SEO友好的URL非常困难,但技术上可行。你最好离开?id=XXX
部分,而是在相反的方法中使用mod_rewrite ...获取与模式/go/My+Search+Terms
匹配的所有网址并将其转换回?id=My+Search+Terms
之类的内容这样,您就可以使用URL的GET参数轻松解析值。这不是一种罕见的做法 - 谷歌实际上仍然使用URL参数进行用户输入(例如URL:http://www.google.com/search?q=test
)。
请记住,mod_rewrite会在其他任何内容(甚至是PHP)之前重写URL,因此您需要对要处理的URL执行任何操作。每次在服务器上调用页面时,都会将mod_rewrite视为基于正则表达式的全局“查找和替换”URL。例如,如果您删除查询字符串,则需要确保您的网站/应用程序/无论如何。
答案 2 :(得分:1)
在application/config/routes.php
$route['go/(:any)'] = "go/index/$1";
go
是您的控制器,index
是索引操作。
http://codeigniter.com/user_guide/general/routing.html
如果您还没有.htaccess
,可以使用以下内容:
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]