301重定向来自mod_rewrite RewriteMap程序

时间:2009-12-10 04:37:12

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

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

http://www.example.com/directory1

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

http://www.example.com/directory1/(尾随斜线)

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

if ($input_url == "/directory1") {
    echo "/directory1/ [R=301]\n";          // this doesn't work... just hangs
}
else if ($input_url == "/directory1/") {
    echo "/myprogram.php?id=1\n";
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

这不可能以你想要的方式实现。但您可以使用其他规则重定向所有URL请求,而不使用尾部斜杠:

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