2011-04-12 125 views
0

我使用单一表单和输入文本(Google风格)为我的网站创建首页。它工作正常,但是,我想根据输入生成一个漂亮的URL。比方说,我的输入被称为“ID”,以及使用形式的GET方法,并定义操作“/去/”,在提交的URL将是:基于表单输入的URL重写

site.com/go/?id=whateverIType 

,我想改变它

site.com/go/whateverIType 

我想在现代重写,但如果用户装上去的网址,例如:

site.com/go/?dontwant=this&id=whateverIType&somemore=trash 

我想忽略其他变量,但“身份证”,并重写规则。

完成这件事的最好方法是什么?提前致谢! PS:我使用的是CodeIgniter,也许我也可以使用它。我已经有了一个“去”的控制器。

回答

1

我不熟悉笨,但你可以尝试以下RewriteRule

RewriteEngine on 
RewriteCond %{REQUEST_URI} ^\/go\/ 
RewriteCond %{QUERY_STRING} id=([^&]*) 
RewriteRule (.*) /go/%1? [L,R] 

%1引用的正则表达式组从以前RewriteCond,和后?将重定向的URL剥离查询字符串。

希望这会有所帮助。

+0

的''字符是在正则表达式特殊字符。你确定你不需要逃避它('\?')吗? – qJake 2011-04-12 18:22:40

+0

“RewriteRule”的第二个参数是一个字符串,所以'?'可以。 – clmarquart 2011-04-12 18:27:26

+0

我在想,我会创建一个专门的搜索控制器,通过GET请求接受数据。无论如何感谢clmarquat! – 2011-04-13 19:36:36

1

Mod_rewrite支持conditionsrules用正则表达式,所以你可以有一个相匹配的?id=XXXX,会从URL中提取它(保持其他参数),并相应地改写了URL的规则。

但是......我不认为你想这样做,因为如果你将网址改写为/go/Some+Search+Query,那么你将无法通过说PHP来提取它,而无需手动解析URL 。

使用用户输入来定制适合搜索引擎优化的URL是非常困难的,但它在技术上是可行的。你最好离开?id=XXX部分,相反,使用mod_rewrite的相反方法...采取匹配模式/go/My+Search+Terms的所有网址,并将其翻译成类似?id=My+Search+Terms的东西,这样您就可以轻松解析使用URL的GET参数输出值。这并不罕见 - Google实际上仍然使用URL参数进行用户输入(例如,URL:http://www.google.com/search?q=test)。

请记住,mod_rewrite会在其他任何地方(甚至是PHP)之前重写URL,所以你需要对URL进行任何操作。每次在服务器上调用页面时,都应将mod_rewrite视为基于正则表达式的全局“查找并替换”URL。例如,如果您删除了查询字符串,则需要确保您的网站/应用程序/无论哪种帐户。

+0

感谢您的建议SpikeX!事实上,我正在计划一些事情!所以,我的案例有更好的解决方案:表单将创建一个GET请求到搜索控制器。如果它找到完全匹配,那么它将重定向到产品控制器。 – 2011-04-13 19:34:32

+0

听起来像一个很好的计划。 :) – qJake 2011-04-13 19:45:18

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] 
+0

您的解决方案解决了问题的最后一部分。对于精确的结果匹配,它会将用户重定向到正确的控制器。谢谢! – 2011-04-13 19:30:11