htaccess重写中301重定向的相对URL

时间:2017-10-26 16:52:39

标签: apache .htaccess redirect mod-rewrite

我以前在https://example.com/myapp/doc/file.html有一个文档文件,但我现在决定在https://example.com/myapp/doc/上托管文档。注意,路径可以是不同的,例如, http://customer.com:8080/foo/bar/myapp/doc/file.html

如何使用htaccess重定向到正确的目录?我的尝试是:

RewriteEngine On
RewriteRule ^file\.html$ "" [R=301]

这会将文件系统路径放在URL中,并且完全不适合。如果我想要一个内部重定向它可能会工作,但我明确地想要一个301。

RewriteEngine On
RewriteRule ^file\.html$ "%{REQUEST_SCHEME}://%{HTTP_HOST}/myapp/doc/" [R=301]

这样可行,但只有当我的应用程序安装到URL根目录中时才有效。当客户将其放入/foo/bar时,它会失败。

如何301重定向到当前目录?

1 个答案:

答案 0 :(得分:2)

以下代码应该可以在任何位置将当前目录中的file.html重定向到当前目录本身,而无需对路径进行任何硬编码。它将REQUEST_URI变量(完整路径)与RewriteRule匹配的URI(相对于当前路径)进行比较,并在%{ENV:BASE}变量中得到差异。

RewriteEngine On

# find rewrite base dynamically
RewriteCond $0#%{REQUEST_URI} ^([^#]*)#(.*)\1$
RewriteRule ^.*$ - [E=BASE:%2]

RewriteRule ^file\.html$ %{ENV:BASE} [L,R=301,NC]

例如,它将执行以下重定向:

  • /foo/bar/myapp/doc/file.html/foo/bar/myapp/doc/
  • /myapp/doc/file.html/myapp/doc/
  • /some/path/file.html/some/path/