如何使用 .htaccess 将 root 重定向到 /~user 子目录 (Apache mod_userdir)?

How to redirect root to /~user subdirectory (Apache mod_userdir) using .htaccess?

Apache 的 mod_userdir

我们公司提供使用 Apache 的“每用户目录 mod”托管我们网页的服务(参见 doc)。

即Alice、Bob和我自己可以通过

访问我们自己的子目录

分别

问题

问题是我在基于根的结构上开发了我的网站。

即在dev环境中,在prod环境中可以通过http://example.com/resource, which should be translated to http://example.com/~me/resource访问一个资源。

出于显而易见的原因,这种结构更可取,因为它更容易迁移到另一个网络服务器或将代码移植到其他调试环境(例如:IIS、Wampserver 等)。我最初的计划是以这种方式编写我的代码,然后在 .htaccess 中重定向流量。

通过 .htaccess 重定向

我已经尝试了列出的所有解决方案 here 但没有成功。

我认为上面 link 中提出的解决方案与我的问题不同,因为 .htaccess 位于 root,并且重定向已完成从 root 到子文件夹.

在我的例子中,.htaccess 位于 子文件夹 中。单击 URL 时,它会将客户端重定向到 http://example.com/resource,这是对 root 的请求。此时,我无法使用 .htaccess 重定向流量,因为客户端现在不在我的子目录中。

这是我用 .htaccess.

尝试过的

解决方案 1 (RedirectMatch):

RedirectMatch ^/$ /~me/

结果:http://example.com/~me 被无限重定向到 http://example.com/~me/~me/~me/~me/~me/~me/~我/~我/~我/~我/~我/~我/~我/~我/~我/~我/~我.

解决方案 2 (RewriteRule):

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/~me/
RewriteRule ^(.*)$ /~me/

结果:没有执行重定向。可能是因为我的 .htaccess 失效了。

问题

有没有办法使用我自己的 .htaccess 将流量重定向到我的子目录?

一种非常不优雅的方法是从根重定向流量,但这会中断到 Alice、Bob 和管理员的流量。

比如说,在根目录的.htaccess中,来自http://example.com/resource的所有流量都会被重定向到http://example.com/~me/resource。但如果 Alice、Bob 或管理员使用 http://example.com/resource,他们将对我的规则不满意。

有解决办法吗?

编辑: 正如 Stephen Ostermiller 中肯指出的那样,一种想法是通过根据我的环境设置基础 URL 来强制重定向。但是,我想问是否有任何解决方案不涉及重写我的代码和重新调试所有 URL 重定向。例如,通过调整 .htaccess 或任何超全局配置文件都可以。

感谢 Stephen Ostermiller 的评论,我将其总结为我的问题的答案。

我们通常不想依赖重定向来更正我们网络应用程序中的 links。最小化重定向不容易出错,性能更好,并且 SEO 到 link 比实际的 URL 更好。

我所做的是在 .htaccess 中使用 SetEnv 定义一个环境变量来指定基础 URL。如果它没有定义,那么它在我的 PHP 代码中是 returns false,但一切都应该有效(你可以将布尔值与字符串连接起来)。否则,如果指定了环境变量,我所有的 URL 都会用基础 URL 替换根。

正如 Stephen Ostermiller 所建议的,如果需要将其部署到子目录,建议为您的 Web 应用程序设置一个配置选项来设置基础 URL。