我看过很多网站都这样做,但没有找到解释这个问题的指南。 我有这个.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)
我该怎么做?
答案 0 :(得分:1)
重写是服务器的内部逻辑,即您在地址栏中看到的长URL请求的浏览器,HTTP服务器将其路由到较短的URL。如果您希望浏览器显示较短的网址,则需要使用Redirect
代替Rewrite
。
请注意,使用重定向时,页面的加载速度会变慢,因为服务器会将重定向响应返回给浏览器,然后浏览器再次请求页面。
答案 1 :(得分:0)
有很多关于如何做到这一点的消息来源。这是我用Google搜索时得到的第一个。
http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls/
答案 2 :(得分:0)
规则的作用类似于:
RewriteRule <pattern_A> <target_B>
始终从<pattern_A>
到<target_B>
,从不相反,此规则没有“链接”2个请求。 top part of this answer解决了“网址因其他网址而被更改”时发生的两种不同情况。
您所拥有的规则采用不带查询字符串的URL,并在内部将其重写为带有查询字符串的php文件。浏览器没有看到这种情况,它是“幕后”。当你说你希望地址栏显示没有查询字符串的URL时,你首先会找到一些其他的URL,而“其他”URL需要从外部重定向浏览器。所以根据你已有的规则:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /profile\.php\?id=([^&\ ]+)
RewriteRule ^ /users/%1? [L,R=301]
匹配请求字符串,而不是请求URI(沿URL处理管道和重写引擎更改),提取ID,将浏览器重定向到新URL而不是使用R=301
标志查询字符串。
您确实需要更改所有内容,以便他们使用更清晰的网址,而不是依赖于重定向浏览器的非常麻烦和低效的方式,然后在内部重写返回< / em>到原始网址。