如何使用 mod_rewrite 将页面转发到不同的文件

如何使用 mod_rewrite 将页面转发到不同的文件

我正在尝试使用 mod_rewrite 将用户从默认转发index.htmldefault.php,我尝试使用:

Redirect 301 /index.html /default.php/html/.htaccess

但它会反复添加 default.php 直到失败:

http://localhost/default.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.phpdefault.php

编辑:

我想通了,不应该有 301,我需要使用如下所示的完整 URL:

Redirect /index.html http://localhost/default.php

只需要知道如何指定一个变量来给我http(s)://servername

答案1

只是不知道如何自动添加服务器名称

你不应该需要到。事实上,你不能“自动”添加服务器名称使用 mod_aliasRedirect指令。它总是更安全但是,为目标包含一个硬编码的绝对 URL,根相对 URL 仍然可以在单个规范主机上正常工作 - 这似乎是这里的情况。(?)如果它不起作用,那么也许表明其他服务器配置错误?

或者,您可以尝试 mod_rewrite(如果已启用)重定向(使用指令RewriteRule)。这确实为服务器名称提供了变量,尽管这也不是必需的。

请注意,您不应混合使用 mod_alias 和 mod_rewrite 重定向。混合指令可能会导致意外冲突 - 因为这两个模块在不同时间运行,无论其明显的顺序如何。

尝试在 .htaccess 中使用以下 mod_rewrite 重定向,而不是Redirect在您的问题中使用。

RewriteEngine On
RewriteRule ^index\.html /default.php [R=302,L]

在替换中具体使用“变量” RewriteRule

RewriteRule ^index\.html http://%{SERVER_NAME}/default.php [R=302,L]

请注意,这应该在任何规范重定向之后进行。

除了SERVER_NAME,您还可以使用HTTP_HOST来引用请求中使用的主机名。不过,根据您的服务器配置,它们可能引用的是同一件事(即请求中使用的主机名)。

这显然对协议进行了硬编码,例如。http(或https)。 您真的有混合协议请求吗? (理想情况下,应该在请求的早期就将其规范化。)

这也是一个302(临时)重定向。如果您确定它可以正常工作,请将其更改为301- 如果需要的话。临时重定向更容易测试,因为它们不会被浏览器缓存。


另外:这个重定向看起来确实有点“可疑”。通常,您不一定期望index.htmldefault.php成为可见 URL 的一部分。相反,当请求父目录(以斜杠结尾)时,Apache(使用DirectoryIndexmod_dir 指令)可以自动提供(通过内部重写)相应的DirectoryIndex文档。因此,您可以更改文档DirectoryIndex

DirectoryIndex disabled
DirectoryIndex default.php

default.php这将(仅)在请求的任何目录中进行查找。此disabled行是必需的,以便消除前一个文档,因为附加文档通常会附加到列表中,但如果旧文档(index.html)仍然存在,这可能不是所希望的。

相关内容