在提供某个文件(无论在哪个URI下)时重写URI?

时间:2013-05-27 17:25:35

标签: .htaccess mod-rewrite redirect uri canonicalization

当提供某个“物理”(静态)文件时,.htaccess是否可以将某个URI重定向/重写(301)?最初提供此文件的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变体。

2 个答案:

答案 0 :(得分:1)

如果您要将这些网址中的任何一个重定向到http://example.com/,以下内容将有效。

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

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

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

答案 1 :(得分:1)

1。从/到index.html的重定向

/index.html的透明重定向由mod_dir通过DirectoryIndex指令操作

如果要重定向,可以使用DirectoryIndexRedirect指令:

 DirectoryIndexRedirect permanent

这会对您要实现的效果产生相反的效果,因为它会将http://example.com/重定向到http://example.com/index.htm

2。从索引重定向到index.html

indexindex.html的透明重定向由+MultiViews选项操作,此选项已在您的Apache配置或.htaccess文件中设置:

Options +MultiViews

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

3。解决您的问题

您可以使用变量DirectoryIndex检测Apache内容协商和SCRIPT_FILENAME选择的文件。如果这恰好是索引文件,您可以删除最后一个/如果有的

之后的URL部分
RewriteCond expr "%{SCRIPT_FILENAME} -strmatch '*/index.*'"
RewriteRule (.*/)?(.*) $1 [R=301]