2010-08-27 119 views
1

即使是简单的.htaccess让我头痛,我需要做下面的通用映射:通用htaccess的URL重写

http://example.com/project/controllername/key1/val1/key2/val2/.../keyN/valN 

--> 

http://example.com/project/controllername.xyz?key1=val1&key2=val2...&keyN=valN 

例如:

http://example.com/so/pagecontroller/id/1/time/12345/title/helloworld 

--> 

http://example.com/so/pagecontroller.xyz?id=1&time=12345&title=helloworld 

任何指导将帮助!特别是处理特殊字符如'/','?'和'&'(更多?)的键和值。

编辑:为了说明'project'和'controllername'路径是动态的 - 它们不是静态的。此外,键和值的数量不是预先确定的!我需要帮助创建htaccess文件代码以及将该文件放置在Web树中的哪个位置,并且如果每次修改htaccess文件时apache都需要重新启动。谢谢!

回答

0

只要你不想选择那些特殊字符,他们应该没问题。你的例子的规则可能是:

RewriteRule http://example.com/so/pagecontroller/id/([0-9]+)/time/([0-9]+)/title/(.*)$ http://example.com/so/pagecontroller.xyz?id=$1&time=$2&title=$3 

我不认为你可以在重写规则中有一个动态数量的变量。但是你可以做的是:

RewriteRule http://example.com/so/pagecontroler/(.*) http://example.com/so/pagecontroler.xyz?vars=$1 

比你有一个名为“瓦尔”和查询作为值的其余部分GET参数。您可以分割不同的键和值服务器端,例如与PHP的explode() function

+0

谢谢,但我不能硬编码的钥匙或他们的立场。 – Yehonatan 2010-08-30 06:15:19

+0

是的,我想我可以提供所有的键和值作为单个参数。 – Yehonatan 2010-08-31 09:57:25

0

尝试下列规则:

RewriteRule ^([^/]+/[^/]+)/([^/]+)/([^/]+)(/.+)?$ $1$4?$2=$3 [QSA,N] 
RewriteCond $1 !.+\.xyz$ 
RewriteRule ^([^/]+/[^/]+)$ $1.xyz [L] 
+0

谢谢,我会尽快对此进行测试。这会处理动态数量的键和值吗? – Yehonatan 2010-08-30 06:16:33