【问题标题】:redirecting all dynamic urls to index page将所有动态 url 重定向到索引页面
【发布时间】:2012-03-28 16:04:52
【问题描述】:

因为我想将所有动态网址(如 http://www.mysite.com/play.php?id=4820)重定向到 http://www.mysite.com/

我有这么多动态 url,我不希望我的用户看到诸如找不到页面之类的页面,所以每当用户尝试访问像上面这样的动态 url 时,他应该被重定向到主页。请谁能告诉我如何使用 .htaccess 实现这一目标

问候, phphuger.

【问题讨论】:

  • 我有一个问题。你的重写引擎启用了吗?我假设是这样,但我倾向于先仔细检查所有明显的问题。另外,您能否再举几个不应重定向的链接和应重定向到主页的链接的示例。我只是为了确保我更好地理解这个问题。
  • 实际上我正在升级我的网站,其中包含所有动态网址。现在我已经升级到静态网址。因为我不会放弃已经为我的网址添加书签的用户,所以应该将它们重定向到主页。我的示例网址是这样的 mysite.com/play.php?id=1,http://www.mysite.com/… 其中 n=5000 假设。所以我想将所有这些网址重定向到mysite.com
  • 啊,好吧,我想我现在明白了。我修改了我的答案。我会早点回答的,但我不得不睡觉。

标签: php apache .htaccess


【解决方案1】:

启用 mod_rewrite 并将此代码放入 DOCUMENT_ROOT 下的 .htaccess 中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+play\.php[\s\?] [NC]
RewriteRule ^ / [L,R]

【讨论】:

  • 哇很棒的解决方案..但问题是如果我输入 mysite.php/play.php 它不起作用...
  • 它也可以与mysite.php/play.php 一起使用,但根据您的问题,您似乎只希望mysite.php/play.php?id=1234 重定向。
  • 现在检查我编辑的答案,它也适用于mysite.php/play.php
【解决方案2】:

我认为应该这样做。

RewriteRule ^\?.*$    http://www.mysite.com

【讨论】:

    【解决方案3】:

    EDIT2

    好的,现在我想明白你的问题了。

    您在 play.php 中有一个用于处理所有 url 的 url,并且您希望它们被重定向到主页。

    这里有两种可能的解决方案。这是第一个:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/play.php* [NC]
    RewriteRule . /? [L,R=301]
    </IfModule>
    

    以上将使用 301 重定向将任何对 play.php 的请求重定向到您的主页,这意味着重定向是永久性的。这与临时的 302 重定向不同。所以使用 301 重定向很重要。

    同样在这个重写规则中,我们不关心 url 是否存在。所以你不需要有实际的 play.php 文件或任何东西。它只是根据 url 进行匹配。

    在RewriteRule那一行,末尾有一个问号,这是为了在重定向时从url中删除查询字符串。我假设您不希望查询字符串结转。

    [NC] 用于不区分大小写的匹配,因此/PlAy.php 也会被重定向

    另一种方法是使用重定向指令:

    Redirect 301 /play.php http://www.mysite.com/
    

    如果用户尝试访问 play.php,这将执行 301 永久重定向到您的主页。唯一的缺点是查询字符串出现了。您可以在末尾添加一个问号,它将删除查询字符串。不幸的是,问号仍然存在。

    如果你碰巧有多个端点,而不仅仅是 play.php,你可以这样做:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/play\.php* [NC, OR]
    RewriteCond %{REQUEST_URI}  ^/another_url\.php* [NC]
    RewriteRule . /? [L,R=301]
    </IfModule>
    

    此 RewriteRule 将匹配 play.php 或 another_url.php 并执行 301 重定向到您的主页。

    或者:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} ^/(play|another_url)\.php* [NC]
    RewriteRule . /? [L,R=301]
    </IfModule>
    

    这是使用重定向指令的替代方法

    Redirect 301 /play.php http://www.mysite.com/
    Redirect 301 /another_url.php http://www.mysite.com/
    

    您也可以使用 RedirectMatch 指令来使用正则表达式(注意我还没有实际测试过这个)

    RedirectMatch 301 /(play|another_url)\.php http://www.mysite.com/
    

    编辑

    忽略这个答案。我误读了你的问题。以下将所有请求重定向到 index.php ,除非文件或目录存在,这不是您现在想要的,因为我阅读了您的问题。

    这是 Wordpres 的做法。我相信 Zend 和 Joomla 也有这种变化。

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    

    【讨论】:

    • 嗨,感谢您的回复..我已经在我的 htaccess 文件中应用了您的规则,但仍然没有运气..它无法正常工作..
    • 是的,很抱歉。我误读了您的问题,无法删除我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多