【问题标题】:Can't get mod_rewrite to correctly (and invisibly) re-write my URLs?无法让 mod_rewrite 正确(且不可见地)重写我的 URL?
【发布时间】:2012-11-22 19:38:48
【问题描述】:

我正在尝试为我的网站提供 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 

我做错了什么?

谢谢!

【问题讨论】:

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


    【解决方案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 表示“仅当文件不存在时”。

    【讨论】:

    • 您的规则似乎没有将任何内容传递给redirect.php,还是我误解了什么?
    • 您不必这样做 - 如果是内部重定向,您可以在 $_SERVER['REQUEST_URI'] 中获取原始网址。
    • “但我会确保按名称提及脚本。” - 这就是问题所在。添加 index.php,突然一切正常。谢谢你的帮助卢克。
    【解决方案2】:

    使用绝对网址:

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

    【讨论】:

    • 我不想要 302 或 301。我应该能够重写此 URL,而无需 302/301 所需的额外 HTTP 跃点 - 浏览器/用户不需要知道这个中间步骤。
    • 好吧,我不是很理解,因为您将 301 和 302 代码与“可见/不可见”部分混合在一起,两者都不是。我可以理解这个问题,但写作令人困惑。查看我的编辑。
    • 他不想要硬重定向,他希望它是内部的,这是它没有做的。硬重定向发生在他的脚本中(我假设它是用 PHP 编写的)。
    • 这个应该是内部的,不是吗?我对某些应用程序进行了几次类似的重写(对于 url “美化”),并且 URL 的“querystring-version”从未显示在浏览器中。
    • 是的,应该是,JCL。我不明白出了什么问题。是因为我的其他重定向没有的 HTTP_HOST RewriteCond 吗?也许这让 Apache 感到困惑,以为我是从一个域指向另一个域,这显然是不可能没有 301/302 的。虽然我不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2020-12-09
    • 2020-05-14
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多