无法让mod_rewrite正确(并且无形地)重写我的URL?

时间:2012-11-22 19:38:49

标签: apache mod-rewrite url-rewriting short-url

我正在尝试为我的网站制作网址缩短服务。

所以而不是:

http://www.myfullwebsitename.com/page78/this-is-a-headline/

用户可以访问:

http://abc.de/aBxf

需要重定向(无形!)到

http://abc.de/?shorturl=aBxf

然后301通过数据库查找重定向到

http://www.myfullwebsitename.com/page78/this-is-a-headline/

我可以轻松地进行数据库查找和301重定向。这是我正在努力的无形中间重定向。

我尝试了很多不同的东西,但似乎都没有。这就是我目前感觉应该的工作:

RewriteCond %{HTTP_HOST} ^abc.de
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^/(.+)  /?shorturl=$1

但不是默默地重定向到

http://abc.de/?shorturl=aBxF 

它将“吵闹”(302)重定向到

http://abc.de/aBxF/?shorturl=aBxF 

我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

你可以尝试一些事情。

我认为您的RewriteRule应该如下所示(没有转发/):

RewriteRule ^/(.+)  ?shorturl=$1 [L]

这至少应该阻止它重定向到http://abc.de/aBxF/

如果添加以下内容,您的原始规则可能会有效:

RewriteBase /

如果是我,我的规则实际上就是这样:

RewriteBase /
RewriteCond %{HTTP_HOST} ^abc.de$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .  /redirect.php [L]

然后在PHP中我会使用$_SERVER['REQUEST_URI']来获取URL(不确定您使用的是哪种语言)。

规则可能如下所示:

RewriteRule ^(.*)$  /redirect.php?shorturl=$1 [L]

但我会确保按名称提及脚本。可能抛弃规则的部分原因是依赖Apache在重写后找到你的索引文件。

Apache的重写规则的工作方式是,只要重写URL,它就会重新运行规则,直到找不到其他规则。 “last”的[L]标志表示“停在这里” - 但它仍然从顶部开始。带有!-f标志的RewriteCond表示“仅当文件不存在时”。

答案 1 :(得分:0)

使用绝对网址:

RewriteCond %{HTTP_HOST} ^abc.de
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*)$ http://abc.de/?shorturl=$1 [R=301,L]