【问题标题】:Apache mod_rewrite - want a file system redirect not a 301 redirectApache mod_rewrite - 想要文件系统重定向而不是 301 重定向
【发布时间】:2014-06-02 04:52:48
【问题描述】:

我在运行 Apache 的共享 Web 主机上有 example1.com。它有一个目录 example1.com/foo。我现在希望 example2.com 提供来自 example1.com/foo 的相同内容,除了在 example2.com 根目录中没有 URL 中的中间目录。像 example2.com/bar.html 应该提供与 example1.com/foo/bar.html 相同的内容。

RewriteEngine on
RewriteCond %{HTTP_HOST} example2.com$ [NC]
RewriteRule ^(.*)$ foo/$1 [NC]

这个简单的重写规则接受任何针对 example2.com 的请求,并插入 foo/ 以指向该目录中的内容。问题是这一直在进行外部 301 重定向。我不希望这样,我希望浏览器停留在 example2.com 上而不进行重定向,而 Apache 从文件系统中的 /foo 提供内容。

多次查看 Apache mod_rewrite 文档,其中说明了如何使用 [R] 标志强制 301 重定向,但没有说明如何强制它不发生。我在这里想念什么?它在我的 Linux 共享主机和在 Windows 上使用 Apache 进行的本地测试上表现相同。

谢谢!

【问题讨论】:

  • 两个域的 DocumentRoot 是否相同?
  • 是的。我无法在共享虚拟主机上更改它。
  • 实际上,我现在看到我真正想做的是让 DocumentRoot 对于两个不同的域表现不同。不过,我无法更改共享 Web 主机上的服务器配置。是否可以通过基于 http_host 的 .htaccess 中的 mod_rewrite 规则重新映射 DocumentRoot?我对此表示怀疑,因为 Apache 需要 DocumentRoot 已经设置为首先找到 .htaccess。

标签: apache .htaccess mod-rewrite redirect


【解决方案1】:

我想通了。发生 301 是因为我在规则中输入了错误的目录名称。所以规则的结果指向了一个不存在的路径,这使得 Apache 尝试从文件系统重定向回退到 301 重定向。

然后我不得不修复一个无限循环,因为上面的规则总是将“foo”添加到 URL 中,即使它已经存在,所以我会得到 foo/foo/foo/foo/... 。只有当它不存在时,我们才需要添加它。必须使用这个两步规则,因为您不能在否定规则的捕获组中使用通配符。但这似乎可行,当主机是 example2.com 并且 URL 尚未包含“foo”时添加“foo”。

RewriteEngine on
RewriteCond %{HTTP_HOST} example2.com$ [NC]
RewriteRule !^foo - [C]
RewriteRule ^(.*)$ foo/$1 [NC,PT]

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多