我目前在我的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我显然得到一个重定向无限循环。我怎样才能实现我的目标?提前感谢您提供的任何帮助。
答案 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]
如果您无法访问该标记,则会收到内部服务器错误。在这种情况下,我建议让重定向规则仅匹配外部请求。
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]