将subdir重定向到root,root重定向到subdir,避免无限循环

时间:2014-09-08 17:04:42

标签: apache .htaccess

我目前在我的htdocs root中部署了以下.htaccess:

RewriteEngine On

# Map / to /foo.
RewriteRule ^$ /foo/ [L]

# Map /x to /foo/x unless there is a x in the web root.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/foo/
RewriteRule ^(.*)$ /foo/$1

这会重新引导example.com/foo/ww以及example.com/whatever,除非它与其他应用程序所在的其他目录相匹配(例如,例如:/ appmin / what,应该保持这种方式)。这部分行为是可取的。但现在我在foo的每个页面都有两个url,我有example.com/foo/whatever和example.com/whatever。我想对从/ foo / x到/ x的所有请求进行301重定向,但是如果我添加

# Redirect /foo/x to /x
RewriteRule ^foo/(.*)$ /$1 [R=301,L]

到.htaccess我显然得到一个重定向无限循环。我怎样才能实现我的目标?提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

要防止重定向循环,您可以执行以下操作。如果您运行的是最新的Apache版本,则可以访问[END]标志。当你在内部重写时,可以使用它来完全停止重写,防止重定向开始。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/foo/
RewriteRule ^(.*)$ /foo/$1 [END]

# Redirect /foo/x to /x
RewriteRule ^foo/(.*)$ /$1 [R=301,L]

请参阅the documentation

如果您无法访问该标记,则会收到内部服务器错误。在这种情况下,我建议让重定向规则仅匹配外部请求。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/foo/
RewriteRule ^(.*)$ /foo/$1

# Redirect /foo/x to /x
RewriteCond %{THE_REQUEST} ^(GET|POST)\ /foo/(.*)\ HTTP
RewriteRule ^ /%2 [R=301,L]