Mod rewrite 301从mod_重写映射程序重定向

Mod rewrite 301从mod_重写映射程序重定向,mod-rewrite,url-rewriting,http-status-code-301,Mod Rewrite,Url Rewriting,Http Status Code 301,我使用mod_rewrite的RewriteMap指令来处理URL。我的RewriteMap程序是一个PHP脚本,一切运行正常。我能够将友好的URL映射到PHP程序+ID。无论如何,我要做的是为某些URL返回301重定向。例如,如果有人输入URL: 然后我希望我的RewriteMap程序将301重定向发送到 (尾随斜杠) 然后将再次进入我的程序,映射到PHP脚本。我尝试在语句末尾添加[R=301],但这只是挂起了请求。以下是我的脚本的基本逻辑: if ($input_url == "/dire

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

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

(尾随斜杠)

然后将再次进入我的程序,映射到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"; } 如果($input_url==“/directory1”){ echo“/directory1/[R=301]\n”;//这不起作用…只是挂起 } 如果($input_url==“/directory1/”),则为else{ echo“/myprogram.php?id=1\n”; }
有什么想法吗?

这不是你想要的方式。但是,您可以使用附加规则重定向URL的所有请求,而不使用尾随斜杠:

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

这不可能是你想要的方式。但是,您可以使用附加规则重定向URL的所有请求,而不使用尾随斜杠:

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

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

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

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

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

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

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

您提到mod_rewrite,这是一个Apache模块,但随后您向我们展示了一些PHP代码。这里有一些混乱吗?哦,我认为PHP应用程序是重写prg,嗯?你提到mod_Rewrite,这是一个Apache模块,但随后你向我们展示了一些PHP代码。这里有一些混乱吗?哦,我认为PHP应用程序是重写prg,嗯?这就是我最终发现的——但是在我的例子中,这不是一个选项,因为有时它可能是一个目录名,有时它可能是传递的选项。例如:应该301到:但不应该是301'd——只是根据我设置的规则重写。我想我可以修改重写条件以查找任何不以.html结尾的问题,但我希望它对于发送的任何类型的字符串都是灵活的。@Sridhar:是的,这可能是最好的解决方案。但是您也可以使用映射来查看是否接受带有尾随斜杠的相同请求,然后执行重定向:
RewriteCond%{mymap:$0/}!^$RewriteRule.[^/]$%{REQUEST_URI}/[L,R=301]
。这就是我最终发现的——但在我的例子中,这不是一个选项,因为有时它可能是一个目录名,有时它可能是传递的选项。例如:应该301到:但不应该是301'd——只是根据我设置的规则重写。我想我可以修改重写条件以查找任何不以.html结尾的问题,但我希望它对于发送的任何类型的字符串都是灵活的。@Sridhar:是的,这可能是最好的解决方案。但是您也可以使用映射来查看是否接受带有尾随斜杠的相同请求,然后执行重定向:
RewriteCond%{mymap:$0/}!^$重写规则。*[^/]$%{REQUEST_URI}/[L,R=301]