【问题标题】:301 redirect from mod_rewrite RewriteMap program来自 mod_rewrite RewriteMap 程序的 301 重定向
【发布时间】:2010-12-25 02:53:35
【问题描述】:

我正在使用 mod_rewrite 的 RewriteMap 指令来处理 URL。我的 RewriteMap 程序是一个 PHP 脚本,一切运行良好。我能够将友好的 URL 映射到 PHP 程序 + ID。无论如何,我想做的是为某些 URL 返回一个 301 重定向。例如,如果有人输入 URL:

@987654321@

然后我希望我的 RewriteMap 程序发送一个 301 重定向到

@987654322@(斜杠)

然后它将再次进入我的程序以映射到 PHP 脚本。我尝试在我的语句末尾添加 [R=301] ,但这只是挂起请求。这是我的脚本的基本逻辑:

if ($input_url == "/directory1") {
    echo "/directory1/ [R=301]\n"; // 这不起作用...只是挂起
}
否则 if ($input_url == "/directory1/") {
    echo "/myprogram.php?id=1\n";
}

有什么想法吗?

【问题讨论】:

  • 您提到了 mod_rewrite,它是一个 Apache 模块,但随后您向我们展示了一些 PHP 代码。这里有什么混乱吗?
  • 哦,我认为 PHP 应用程序是 Rewrite prg,嗯?

标签: mod-rewrite url-rewriting http-status-code-301


【解决方案1】:

RewriteCond 中的 -d 测试是专为您的案例 Sridhar 设计的。它测试文件系统中是否存在目录。如果为真,并且如果没有尾部斜杠,那么您可以应用重定向。应该是这样的:

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]

在这种情况下,您不需要 RewriteMap (prg)。

【讨论】:

    【解决方案2】:

    这不可能按照您想要的方式进行。但是您可以使用附加规则来重定向所有 URL 请求,而无需尾部斜杠:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]
    

    【讨论】:

    • 这就是我最终发现的——但在我的情况下,这不是一个选项,因为有时它可能是一个目录名称,有时它可能是传递的选项。例如:example.com/dir1/subdir 应该 301 到:example.com/dir1/subdir 但example.com/dir1/page2.html 不应该是 301 —— 只是根据我设置的规则重写。我想我可以修改重写条件以查找任何不以 .html 结尾的问题,但我希望它对发送的任何类型的字符串都具有灵活性。
    • @Sridhar:是的,这可能是最好的解决方案。但是您也可以使用地图查看是否会接受带有斜杠的相同请求,然后执行重定向:RewriteCond %{mymap:$0/} !^$ RewriteRule .*[^/]$ %{REQUEST_URI}/ [L,R=301]。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多