【问题标题】:Use htaccess to mask domain and folder name使用 htaccess 屏蔽域和文件夹名称
【发布时间】:2013-02-19 21:37:37
【问题描述】:

我正在尝试使用 htaccess 和 mod_rewrite 将一个域及其两个子文件夹与另一个域屏蔽。例如:http://example.com/sub/sub-sub/http://example-2.com/ 这样http://example-2.com/ 是浏览器地址栏中显示的内容,而http://example.com/sub/sub-sub/ 的内容是页面上显示的内容。

我发现 this question/answer 应该可以完成此操作,但在我实施时它不起作用。

当前htaccess:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+) [NC]
RewriteRule .*   http://example.com/sub/sub-sub/%1 [L]

Options -Multiviews

这是我的目录的视图:

【问题讨论】:

  • 好的,但是两个 URL 中哪些字符串是固定的,哪些是动态的。这就是这类问题的相关信息。其余的似乎很清楚:您想将http://example-2.com/ 静默映射到http://example.com/sub/sub-sub/,但example-2.comsub/sub-sub 之间的相关性是什么,例如,传入URL 中的什么应该传递给替换URL,或者什么都没通过?
  • 在 URL http://example.com/sub/sub-sub/ 中,子文件夹之后的任何内容都应传递给替换 URL。例如,如果我有 http://example.com/sub/sub-sub/a-page.php,那么替换 URL 应该显示 http://example-2.com/a-page.php。希望这是有道理的。

标签: .htaccess mod-rewrite


【解决方案1】:

您不需要转义-,除非在字符类中。即使在那里,您也可以将其作为第一个或最后一个字符不转义。

RewriteRule 中,模式是针对 URL 路径而不是域进行测试的。如果需要针对域进行测试,可以使用RewriteCond

RewriteCond %{HTTP_HOST} !example-2.com
RewriteRule ^/?sub/sub-sub/(.*) http://example-2.com/$0 [R,L]

RewriteCond %{HTTP_HOST} example-2.com
RewriteCond %{REQUEST_URI} !^/?sub/sub-sub
RewriteRule .* sub/sub-sub/$0

【讨论】:

  • 这在我访问http://example-2.com/page 时有效,它会在浏览器和地址栏中正确显示。但是当我访问http://example.com/sub/sub-sub/page 时,我也希望它在地址栏中显示为http://example-2.com/page。所以无论我使用什么域,http://example-2.com 总是显示在地址栏中,但http://example.com/sub/sub-sub 的内容总是显示在页面上。那有意义吗?很难解释。
  • @ElliPetersen 我为所有域not example-2.com 添加了外部重定向。请检查这是否适合您。
  • 现在当我访问http://example-2.com/page 时,它也会重定向到地址栏中的http://example.com/sub/sub-sub/page。所以它几乎就在那里!现在我们只需要将http://example-2.com/page 留在地址栏中。如果这令人沮丧,我很抱歉,我不太了解 htaccess。
  • @ElliPetersen 我忘记了另一个 RewriteCond 以防止无限循环。
  • @ElliPetersen 我刚刚查看了您当前的 .htaccess。您和我的 RewriteRule 之间的区别在于,我进行内部重写,而您进行外部重写。如果省略http://example.com/http://example-2.com/page 应该留在浏览器的地址栏中。它在我的测试环境中这样做。
【解决方案2】:

你可以试试这个:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  !^/sub/sub-sub         [NC]
RewriteCond %{REQUEST_URI}  ^/(.*)                 [NC]
RewriteRule .*   http://example.com/sub/sub-sub/%1 [L]

永久重定向

http://example-2.com/anything

收件人:

http://example.com/sub/sub-sub/anything

假定所有字符串都是固定的,除了段路径anything

对于永久可见重定向,请将[L] 替换为[R=301,L]

上述规则集必须包含在http://example-2.com 根目录下的一个.htaccess 文件中。

更新:

要跳过任何没有路径的传入 URL 的规则,例如 http://example-2.com/,请替换此行:

RewriteCond %{REQUEST_URI} ^/(.*) [NC]

用这个:

RewriteCond %{REQUEST_URI} ^/(.+) [NC]

【讨论】:

  • 这行得通,但是当我直接访问http://example-2.comhttp://example.com/sub/sub-sub/sub/sub-sub/sub/sub-sub/sub/sub-sub/sub/sub-sub/ 等)时,它似乎创建了一个无限循环。另外,现在当我访问 http://example.com/sub/sub-sub/anything 时,我收到 404 错误。这是因为我正在使用另一个重写规则从页面中删除 .php。我已经用我当前的 htaccess 编辑了我原来的问题。
  • 切换规则集的位置。循环不是由我的答案中的集合生成的,它会按照您的要求进行。
  • 我完全删除了另一组规则,现在可以正常工作了,尽管访问地址栏中的http://example-2.com/page 会重定向到http://example.com/sub/sub-sub/page。我尝试将 [R=301,L] 更改为 [L] 但这会产生相同的重定向问题。我在主要问题中更新了我当前的 htaccess http://example.com/sub/sub-sub/。我可能对我想做的事情还不够清楚。请参阅我对以下答案的评论,以了解我希望得到更好的解释。
  • @Elli 我不太明白。当 URL 只是 http://example-2.com/ 时,你想做什么,保持这种状态而不进行重定向?如果是这样,只需将 ^/(.*) 替换为 ^/(.+)
  • 正确,因为http://example-2.com/ 已经通过服务器设置指向http://example.com/sub/sub-sub/。我替换了那条线,但它仍在创建一个循环。我已经在主要问题中更新了我当前的 htaccess。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多