【问题标题】:Redirect subdir to root and root to subdir, avoiding infinite loop将子目录重定向到根目录,将根目录重定向到子目录,避免无限循环
【发布时间】:2014-09-08 17:04:41
【问题描述】:

我目前在我的 htdocs 根目录中部署了以下 .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/whatever 重定向到 example.com/whatever,除非它与其他应用程序所在的其他目录匹配(狐狸示例 example.com/admin/whatever,应该保持这种方式)。这部分行为是需要的。但是现在我在 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 我显然得到了一个重定向无限循环。我怎样才能达到我想要的?提前感谢您提供的任何帮助。

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    为了防止重定向循环,您可以做几件事。如果您正在运行最新的 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]
    

    【讨论】:

    • 谢谢,这成功了! ......好吧,在一个案例中确实如此。在我面临的另一种情况下, foo/ 是 CodeIgniter 应用程序,我必须将一些请求重定向到 foo/index.php/whatever 这不起作用。 I made another question for that。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2019-07-20
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多