2011-04-01 32 views
1

大家好,并提前感谢,我试图添加一个url作为参数,但我不能。 我的原则是:htaccess url作为参数

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^info/([a-zA-Z0-9|]+)/(.*)/(.*)$ info.php?user=$1&text=$2&url=$3 

在浏览器: http://localhost/example/info/peter/hi guy/http://www.example.com

返回数组$_GET PHP

[user] => peter 
[text] => hi guy/http: 
[url] => www.example.com 

什么是正确的:

[user] => peter 
[text] => hi guy 
[url] => http://www.example.com 

我希望你的帮助感谢

回答

1
RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^info/([a-zA-Z0-9|]+)/([^/]*)/(.*)$ info.php?user=$1&text=$2&url=$3 [B,QSA] 

[^/]表示“任何不是斜线的字符”。当然,这意味着“文本”不能包含任何斜杠,但是您的URL将被正确匹配。

另请注意[B]这是您可以添加到重写规则中的众多选项之一。 [B]表示任何&和其他字符都将被转义。因此,如果您作为参数的网址具有查询字符串,则可以在$_GET['url']中读出它,否则其参数将作为新查询字符串的一部分进行整合。

+0

非常感谢你的一切,完美的作品 – Alexd2 2011-04-01 13:05:48

+0

大家早上好,一切正常,直到我得到了一个URL http://www.example.com?foo=34类型或http://www.example.com/index.php? user = 4&w = This-cat 这应该在htaccess中更改以支持所有类型的URL。 再次感谢。 – Alexd2 2011-04-04 07:43:32

+0

将'[B]'更改为'[B,QSA]' – nitro2k01 2011-04-04 21:44:23

0

不是我的专业领域,但为什么不使用$ _SERVER请求的URL?

它可能工作,可能不会,并且这样,如果域名发生变化,那么就不需要更新任何东西。

希望这会有所帮助。

2

这就是所谓的贪婪匹配..“点星号”匹配尽可能多,然后&然后回溯。而是使用[^ /],它将匹配到下一个斜杠。

+0

欲了解更多关于贪婪匹配的信息,请参阅[链接](http://www.regular-expressions.info/repeat.html) – Wick 2011-04-01 12:59:57

1

http://localhost/example/info/peter/hi/guy/http://www.example.com对于您要做的事不是一个有效的URL。 URL部分应该是urlencoded。例如,请参阅this explanation

正确的网址是:

http://localhost/example/info/peter/hi/guy/http%3A%2F%2Fwww.example.com 

虽然存在这一点上,与你的正则表达式的错误是在另一个答案描述贪婪匹配。但是,如果你正确地编码了URL,那就不成问题了。

+0

请参阅我的回答。只要您设法正确地匹配子网址并添加'[B]'标志,它就可以正常工作,而无需在生成链接时编码URL。 – nitro2k01 2011-04-01 13:07:02

+0

@ nitro2k01,是的,但OP给出的例子是一个无效的URL,我认为这值得指出。 – seb 2011-04-01 13:09:06

+0

不是真的......关于它的唯一无效的东西与子URL无关;它是应该被编码为%20的空间。即使SA的解析器不喜欢带有未编码空格的URL,浏览器也会在href属性中自动编码空格等等。这不是问题。另一方面,在URL中传递冒号和斜杠没有任何错误,即使服务器对/和%2F的解释不同。然后是用户友好方面......您可能希望允许用户在URL末尾轻松地打开自己的URL参数,而不必转义角色。 – nitro2k01 2011-04-01 13:45:32