【问题标题】:.htaccess RewriteCond REQUEST_FILENAME.htaccess RewriteCond REQUEST_FILENAME
【发布时间】:2013-12-13 01:34:22
【问题描述】:

我从第三方 (vBSEO) 创建的 .htaccess 文件中有以下内容:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/(admincp|modcp|clientscript|cpstyles|images)/
RewriteRule ^(.+)$ vbseo.php [L,QSA]

如果我已经确定第 2 行不存在该目录,为什么还需要第三行(“如果 REQUEST 不是这个特定目录”)?第二行不是说“如果请求不是目录”吗?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    第二行确实意味着“请求的文件名不是物理目录”。然而,第三行表示“请求的文件名不包含任何序列 /admincp/ 或 /modcp/ 等”。你看,它是一个正则表达式,因为它不使用锚^(表示字符串的开始)或$(表示字符串的结尾),它匹配任何仅包含 这些目录名称。

    所以 .htaccess 表明我们应该将任何请求重定向到 vbseo.php,如果它不是针对现有资源并且请求的文件名不在任何这些目录中。 /admincp/index.html 不会被重定向(假设 index.html 存在)。请注意,/foo/bar/admincp/baz/qux 也不会被重定向。

    【讨论】:

    • 好吧,如果请求是“不是针对现有资源”,那么“请求的文件名 [不能] 在任何这些目录中”,所以我的问题仍然存在:为什么要确保请求是如果它甚至不存在,则不在任何这些目录中?并且“/admincp/index.html 不会被重定向”,即使假设 index.html 存在。
    • 哈哈!是的,我收到警告说这个问题已经被浏览了 2500 次,所以我又看了一遍,忘记了为什么这个答案是有意义的。 :)
    • 我也不得不把头绕在措辞上。我在想什么。但我是凌晨四点写的,太好了……
    【解决方案2】:

    如果请求是现有文件或目录的名称,前两行确实确保没有请求被重定向到 vbseo.php。但是,第三行确保请求不会被重定向,即使它们包含 /(admincp|...)/ 时 存在。

    更重要的是,第三行允许在 vbseo 重定向之后提供不是文件或目录的 资源

    RewriteRule ^blogs$ blogorama.php [L]
    

    例如,如果 /blogs/ 无法通过文件系统访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2023-03-18
      • 2021-12-22
      相关资源
      最近更新 更多