【问题标题】:Subtle htaccess problem. I am going insane微妙的 htaccess 问题。我要疯了
【发布时间】:2010-01-10 18:21:18
【问题描述】:

我希望我的主域托管在子目录中(已完成此步骤),即当有人在后台键入 www.example.com/news 时,它将转到 www.example.com/subdirectory/新闻,但仍会显示为 www.example.com/news。

我已使用以下 bluehost 代码来完成此操作:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/subdirectory/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdirectory/$1

RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ subdirectory/index.php [L]

如果我输入 www.example.com/news/(注意尾部斜杠),此代码有效,但如果我只输入 www.example.com/news(不带斜杠),则此代码无效。任何想法为什么?

谢谢。

【问题讨论】:

  • 您是否有一个名为news 的实际目录可能存在冲突?
  • 不,我所有的文件夹都在一个名为 public 的子目录中。这是一般结构:maindomain 有两个子文件夹(application 和 public)。在 public 里面有名为 news、glossary、about 等的子文件夹。所以没有实际的 www.maindomain.com/news,只有 www.maindomain.com/public/news
  • 另外,澄清一下,如果我输入 www.mymaindomain.com/news 它的工作原理是它显示 www.mymaindomain.com/public/news 的页面,但它也显示公共 url 路径.
  • 我最近也遇到了这个问题,并解决了,但不幸的是我不确定如何。希望这会给您带来希望...如果有帮助,我发现调试的最佳方法是删除所有不是 100% 需要的东西,然后从那里逐渐建立(反复试验...呸)。

标签: .htaccess mod-rewrite redirect


【解决方案1】:

我认为问题在于,在 Apache 将 /news 重写为 /subdirectory/news 之后,它会发现自己的请求与文件系统上的目录匹配,该目录不会以斜杠结尾。所以它会重定向到一个新的 url,包括尾部斜杠。

问题是,我们确实希望添加斜杠以保留规范 url(否则我们最终会得到 /news 和 /news/ 指向同一个地方 - 不利于相对链接、SEO 等) ,只是不太像 apache 的做法。所以我们必须自己做,通过添加以下内容:

RewriteCond %{REQUEST_URI} ^/subdirectory/.*[^/]$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^subdirectory/(.*)$ /$1/ [L,R=301]

此规则的条件将匹配任何以“子目录”开头的请求,一定要匹配 fielsysem 上的目录,但不要以斜杠结尾。 (例如“/子目录/新闻”)。然后重写器发出一个永久重定向到同一路径,但以斜杠结尾并去掉“子目录”(例如“/news/”)。

然后客户端将发出对“/news/”的请求,apache 会将其重写为 /subdirectory/news/,并且不会发出重定向,因为它以斜杠结尾。

对此进行了快速测试,它似乎可以解决问题。

【讨论】:

    【解决方案2】:

    不是你的问题的真正答案,但不是更容易

    • 将您的 DocumentRoot 更改为公共目录,或者如果您不能这样做(例如在共享主机上)...
    • 将公共文件放在您的文档根目录(public_html 或其他名称)中,将应用程序文件放在它之外的某个位置(或者,如果您不能超过文档根目录,则放在里面,但使用 Deny from all 防止 Web 访问

    【讨论】:

    • 是的,我认为如果我不能让它工作,我将不得不做第二个选项,谢谢你的提示。如果失败,我会再给它一两天尝试并实施它:)
    【解决方案3】:

    andrewmabbott 是对的,要修复它,您需要使用ProxyPassReverse。这将重写所有重定向以使用正确的地址。

    最简单的方法是:

    ProxyPassReverse /subdirectory http://www.example.com/
    

    但是 bluehost 可能禁用了 mod_proxy,在这种情况下这将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多