【问题标题】:How redirect to subfolders using .htaccess file?如何使用 .htaccess 文件重定向到子文件夹?
【发布时间】:2019-12-20 17:47:49
【问题描述】:

我是 php 新手,正在尝试构建我的网站。 我在下面列出的服务器上创建了文件夹结构。

  1. 开发(文件夹)
  2. 管理员(文件夹)
  3. .htaccess(从互联网复制)
  4. index.html(带有即将推出横幅的文件)

我想将我的 .htaccess 文件设置为在用户打开 (abcd.com) 时默认加载 index.html 文件。 子文件夹可以通过点击 abcd.com/admin 或 abcd.com/developement 之类的 url 来访问。 但是我在 .htaccess 文件中做了一些愚蠢的更改,因此它将用户重定向到我不希望他们看到的我的管理员登录页面。 ;(

提前致谢。

RewriteEngine on    
RewriteCond %{HTTP_HOST} ^(www.)?abcd.com$
RewriteCond %{REQUEST_URI} !^/admin/web/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /admin/web/$1  
RewriteCond %{HTTP_HOST} ^(www.)?abcd.com$
RewriteRule ^(/)?$ /admin/web/index.php [L]

【问题讨论】:

  • 为什么需要 .htaccess 来打开 index.html 文件。默认情况下,如果目录中存在索引文件,则会打开它。谁打开abcd.com,直接打到index.html
  • 嗨@AmanjotKaur,你是对的,默认情况下它是 index.html 但我犯了另一个愚蠢的错误,它有一个 在索引文件中,这就是为什么它将用户重定向到管理员登录。感谢您的宝贵时间。

标签: php html .htaccess


【解决方案1】:

有点不清楚你为什么要问这个问题......

作为一名 Web 开发人员,您当然应该能够通过查看文档找到解决 apache http 服务器提供的重写选项的方法。但即使不是:正如@AmanjotKaur 指出的那样,该http 服务器的默认行为是提供index.html 文件(如果存在)。如果不是这种情况,那么您应该查看mod_dir 提供的DirectoryIndex 指令... 此外,简单地回滚到您使用的该动态配置文件的旧版本应该很容易(“.htaccess "),如果您使用修订控制系统进行开发,您当然应该这样做。或者通过使用一个简单的备份你希望有 ...

这里的一般提示是为了简化情况:与其尝试实施规则来引导传入请求,不如简单地分离内容。您的“生产站点”(据我所知尚不可用)不应托管任何内容,而应仅托管您已经拥有的占位符。开发不应该在同一个站点上进行!为此使用单独的 http 服务器,或者至少在同一 http 服务器中使用单独的主机名。这更容易,并提供更可靠的保护。

无论如何,在某些情况下,确实希望将所有传入请求重定向到某个特定文档或路由器脚本,但有一些明确的例外。这可能是您在这里寻找的。由于您的问题有点含糊(您的问题提到了路径/admin,但您的规则实现了路径/admin/web/...),我们只能给您一个起点。你必须从那里开始。为此,您无疑需要查看要在该动态配置文件上使用的 apache http 服务器的 mod_rewrite 的文档。

这是我假设按照您正在寻找的东西实现的东西。不过,您当然需要根据自己的需要对其进行调整。如果您需要进一步的帮助,您需要修改您的问题并更准确地确定您真正想要的内容。您的问题下方有一个edit 按钮。 使用它...

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/index\.html$
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{REQUEST_URI} !^/development/
RewriteRule ^ /index.html [R=301]

RewriteCond %{REQUEST_URI} !^/admin/web/
RewriteRule ^/?admin/(.*)$ /admin/web/$1 [END]

RewriteCond %{REQUEST_URI} !^/development/web/
RewriteRule ^/?development/(.*)$ /development/web/$1 [END]

最好先从 302 临时重定向开始,稍后再将其更改为 301 永久重定向,前提是您确定一切都已正确设置。这样可以防止在尝试时出现缓存问题...

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的[END] 标志的明确提示。您可以尝试升级或使用较旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此实现同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

  • 嗨 @arkascha 感谢您的详细回复,我从您那里学到了新东西,这是我的错误,这就是为什么它重定向到管理员登录页面的原因,因为 index.html 文件中有元数据(写 if for其他人,如果有人面临同样的问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2015-10-06
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多