使用.htaccess更改正在显示的URL,但实际上没有重定向内容?

我有一个RewriteRule设置要更改

http://kn3rdmeister.com/blog/post.php?y=2012\u0026amp;m=07\u0026amp;d=04\u0026amp;id=4

http://kn3rdmeister.com/blog/2012/07/04/4.php

但这实际上是重定向浏览器从哪里获取页面.我还想继续展示

/blog/post.php?y=xxxx\u0026amp;m=xx\u0026amp;d=xx\u0026amp;id=xx

但让浏览器显示更简单的URL

/blog/post/year/month/day/id.php

我在某处读到了有关使用ProxyPass的内容,但我不太清楚我在做什么:P

我希望人们能够访问带有查询字符串的post.php URL,或者带有日期的花式shmancy子目录的干净URL,并获得相同的内容 – 所有这些都在最后显示干净的URL.

最佳答案 你想要这样的东西:

# First if someone actually requests a /blog/post.php URL, redirect them
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /blog/post\.php\?y=([0-9]{4})&m=([0-9]{2})&d=([0-9]{2})&id=([0-9]*)\ HTTP/
RewriteRule ^blog/post\.php$/blog/%2/%3/%4/%5.php [R=301,L]

这会将浏览器重定向到/blog/##/##/##/##.php URI,该URI将显示在其地址栏中.一旦它们被重定向,浏览器就会发送一个/blog/##/##/##/##.php的请求,然后你的服务器需要在内部重写它:

# We got pretty URLs, but need to rewrite back to the php request
RewriteRule ^blog/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^\.]+)\.php$/blog/post.php?y=$1&m=$2&d=$3&id=$4 [L]

这会在内部更改所有内容,以便文件/blog/post.php可以处理请求.

点赞