【问题标题】:RewriteCond to skip actual directories seems to be ignored跳过实际目录的 RewriteCond 似乎被忽略了
【发布时间】:2012-02-09 02:24:44
【问题描述】:

我的问题是 RewriteRule 在我访问物理目录时仍然匹配,例如http://a-domain.com/foo/ 其中foo 是Web 根目录中的普通目录。

.htaccess 文件有:

Options -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .? index.php [L]

它在我的开发服务器上运行良好,但在实时 WHM/CPanel 服务器上运行良好。我有点迷茫。

【问题讨论】:

  • 您的共享主机上是否启用了 mod_rewrite?

标签: .htaccess mod-rewrite apache2 cpanel whm


【解决方案1】:

我已经在我的 cpanel 网站上对此进行了测试,你是对的,我发现问题出在哪里。当您尝试访问网站中没有默认文件(索引)的文件夹时,它会尝试访问负责 403 HTTP 代码的文件,并且由于该文件不存在,它会将 URL 重写为 index.php .

您所要做的就是将其添加到您的.htaccess 文件的上方:

ErrorDocument 403 /index.php?type=err&code=403

【讨论】:

  • 我只选择了Options -IndexesErrorDocument 403 /index.php,因为我避免在.htaccess 中修改查询参数。这允许访问所需的子文件夹,同时将未列出的文件夹传递给 php。
  • 我的服务器生成 403 状态码,这就是为什么我把 403 放在我的答案中。
【解决方案2】:

我在VM which mirrors my own shared service 上试过这个,对我来说效果很好。 foo 目录中有另一个.htaccess 吗?如果是这样,那么重写引擎将忽略您在 DOCROOT 中的引擎并使用它来代替?

【讨论】:

  • 是的,但它没有mod_rewrite 指令。
  • 我猜你的(两个)系统/虚拟主机配置有不同的DirectoryIndex 指令。如果您有一个包含 index.php 的目录索引,则该规则有效,但 /foo/ 然后映射到 /foo/index.php ,因此看来该规则正在触发
  • 我没有触及虚拟主机或系统配置,那么如果它们不同又有什么关系呢?只有具有最高优先级的那个才会生效。有一个 DirectoryIndex 指令,它应该与存在的 /foo/index.php 匹配,但是为什么我的规则会匹配?它有条件,所以它不会匹配真正的目录/文件/符号链接。
  • @Walf,我说的是你的开发服务器的系统/虚拟主机配置与你的生产服务器之间的差异。获取 prod /etc/(apache2|httpd) 目录的 tarball 并进行比较是非常值得的,这样您就可以将 dev 与 prod 对齐,甚至设置一个更紧密地镜像 prod 的本地测试 VM。您还需要小心子查询污染它。尝试添加 [NS] 标志。
【解决方案3】:

/foo/ 目录具有基本身份验证,因此当%{REQUEST_FILENAME} 包含不存在的文件/home/the_user/public_html/401.shtml 时失败。我不认为这是一个问题,因为基本身份验证有效,当我取消身份验证提示时,我得到了一个标准的 401 文件。通常当这些 ErrorDocument 文件丢失时,Apache 会说 此外,在尝试使用 ErrorDocument 处理请求时遇到了 404 类型的错误。

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2016-09-30
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2017-12-05
    • 2012-03-08
    • 2015-12-11
    相关资源
    最近更新 更多