2012-11-08 156 views
0

我见过很多网站,但没有找到解释这一点的指南。 我有这样的.htaccess代码重定向网址并在地址栏上显示短网址

Options +FollowSymLinks 
RewriteEngine On 
RewriteRule ^users/(\d+)*$ ./profile.php?id=$1 

它重定向到site.com/user/1 site.com/profile.php?id=1 但是当它重定向我希望用户在他的地址栏中看到缩短的网址(site.com/user/1)

我该怎么做?

回答

1

重写是服务器的内在逻辑,即要求你在地址栏中看到长URL的浏览器和HTTP服务器是路由到一个更短。如果您希望浏览器显示较短的网址,则需要使用Redirect而不是Rewrite

请注意,使用重定向时,页面加载速度会较慢,因为服务器会将重定向响应返回给浏览器,然后再重新请求该页面。

+0

谢谢,那么它是'重定向^用户/(\ d +)* $ ./profile.php?id = $ 1'?并且我把它放在' '? – Dotan

+0

你在使用什么服务器 - 它是Apache吗? 如果是这样,你应该使用的指令是'RedirectMatch'。它与模块mod_rewrite无关,所以你不需要把它放在条件子句中。 – onon15

+0

是的,apache。我刚刚尝试过'RedirectMatch art /(.*)/article.php?a = $ 1',然后重定向到完整的地址并更改地址栏上的地址。它可以与服务器的apache设置有关吗?感谢您的帮助 – Dotan

0

规则的工作原理是:

RewriteRule <pattern_A> <target_B> 

总是从<pattern_A>作品<target_B>,从来没有倒过来,也没有在2个请求该规则的“链接”。 top part of this answer解决了当“URL为其他URL更改”时发生的两种不同情况。

规则,你有一个没有查询字符串的URL,并在内部用一个查询字符串重写它的PHP文件。浏览器没有看到发生这种情况,这是“幕后”。当你说你想让地址栏显示没有查询字符串的URL时,你首先需要找到一些其他的URL,并且URL需要在外部重定向浏览器。所以,在你已经拥有的规则:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /profile\.php\?id=([^&\ ]+) 
RewriteRule^/users/%1? [L,R=301] 

,对请求字符串,而不是请求URI(其被沿着URL处理管道和重写引擎更改)相匹配,提取ID,并重定向浏览器通过使用R=301标志转换为不带查询字符串的新URL。

你真的需要改变所有内容,让他们使用,而不是依靠重定向浏览器的一个非常繁琐和效率低下的方式,然后在内部重写原来的URL清洁寻找网址。