1

当提供某个“物理”(静态)文件时,是否可以.htaccess将(301)重定向/重写到某个 URI?最初在哪个 URI 下提供此文件并不重要。

例子

在文件根目录下example.com有一个文件index.html。可以使用不同的 URI(取决于服务器配置)访问此文件,例如:

  • http://example.com/
  • http://example.com/index
  • http://example.com/index.html
  • http://example.com/index.html?foo=bar
  • http://example.com///////////index.html

使用像RewriteRule file(index.html) http://example.com/ [R=301,L]我这样的(伪!)规则可以指定此文件的规范 URI,而无需考虑所有可能的 URI 变体。

4

2 回答 2

1

如果您想从这些 URL 中的任何一个重定向到http://example.com/,以下将起作用。

RewriteRule ^index(\.html)?$ http://example.com/ [R=301,L]

(\.html)?部分是一个正则表达式惰性匹配,.html这意味着http://example.com/index并且http://example.com/index.html都将匹配。如果您只想从所有可能的index.html请求中重定向,您可以省略惰性搜索,如下所示:

RewriteRule ^index\.html$ http://example.com/ [R=301,L]

于 2013-05-27T17:39:41.637 回答
1

1.从/重定向到index.html

透明重定向 from /toindex.htmlmod_dir通过DirectoryIndex指令操作

如果你想要一个重定向,你可以使用DirectoryIndexRedirect指令:

 DirectoryIndexRedirect permanent

这将与您尝试实现的效果完全相反,因为它将http://example.com/重定向到http://example.com/index.htm

2.从index重定向到index.html

当您在 Apache 配置或 .htaccess 文件中设置了此选项时,从indexto 的透明重定向index.html由该选项操作:+MultiViews

Options +MultiViews

没有使用 HTTP 301 代码发出此重定向的配置变量。

3.解决您的问题

您可以检测 Apache 内容协商选择的文件并DirectoryIndex使用变量SCRIPT_FILENAME. 如果这恰好是一个索引文件,您可以删除最后一个 / 之后的 url 部分(如果有)

RewriteCond expr "%{SCRIPT_FILENAME} -strmatch '*/index.*'"
RewriteRule (.*/)?(.*) $1 [R=301]
于 2017-06-23T19:11:49.803 回答