AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 78125
Accepted
Paul Dixon
Paul Dixon
Asked: 2009-10-26 10:26:05 +0800 CST2009-10-26 10:26:05 +0800 CST 2009-10-26 10:26:05 +0800 CST

mod_rewrite REQUEST_FILENAME 不包含绝对路径

  • 772

我在 mod_rewrite RewriteCond 条目中的文件测试操作存在问题,该条目正在测试是否%{REQUEST_FILENAME}存在。似乎%{REQUEST_FILENAME}我不是一条绝对路径,而是一条植根于的路径DocumentRoot。

配置

我<VirtualHost>在我的 apache 2.2.9 配置中的一个块中有这个:

RewriteEngine on
RewriteLog /tmp/rewrite.log
RewriteLogLevel 5

#push virtually everything through our dispatcher script
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]*)/?([^/]*) /dispatch.php?_c=$1&_m=$2 [qsa,L]

已尝试诊断

该规则是通过脚本路由对不存在的文件或目录的请求的常用习惯用法。麻烦的是,即使文件确实存在,它也会触发。

如果我删除规则,我可以请求普通文件就好了。但是有了规则,这些请求就会被定向到 dispatch.php

重写日志跟踪

这是我在 rewrite.log 中看到的

init rewrite engine with requested uri /test.txt
applying pattern '^/([^/]*)/?([^/]*)' to uri '/test.txt'
RewriteCond: input='/test.txt' pattern='!-f' => matched
RewriteCond: input='/test.txt' pattern='!-d' => matched
rewrite '/test.txt' -> '/dispatch.php?_c=test.txt&_m='
split uri=/dispatch.php?_c=test.txt&_m= -> uri=/dispatch.php, args=_c=test.txt&_m=
local path result: /dispatch.php
prefixed with document_root to /path/to/my/public_html/dispatch.php
go-ahead with /path/to/my/public_html/dispatch.php [OK]

因此,在我看来,REQUEST_FILENAME 被呈现为来自文档根目录的路径,而不是文件系统根目录,这可能是文件测试操作符失败的原因。

任何解决此问题的指示都非常感谢...

apache-2.2
  • 4 4 个回答
  • 5497 Views

4 个回答

  • Voted
  1. zpea
    2012-10-11T10:53:20+08:002012-10-11T10:53:20+08:00

    我也花了一些时间才知道,但是mod_rewrite 文档中提到了原因:

    REQUEST_FILENAME 与请求匹配的文件或脚本的完整本地文件系统路径(如果当时已由服务器确定REQUEST_FILENAME)被引用。否则,例如在虚拟主机上下文中使用时,与 .的值相同REQUEST_URI。

    这就是为什么它可以在.htaccessvhost 的 conf 文件中工作,但不能在虚拟主机的 conf 文件中工作。(这也是为什么DOCUMENT_ROOT围绕问题添加作品的原因)。

    • 4
  2. Best Answer
    Paul Dixon
    2009-10-26T10:43:32+08:002009-10-26T10:43:32+08:00

    我通过将文档根显式写入条件来解决此问题

    RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-f
    RewriteCond /path/to/my/public_html%{REQUEST_FILENAME} !-d
    
    • 3
  3. MrWhite
    2020-12-11T06:03:22+08:002020-12-11T06:03:22+08:00
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    

    这在虚拟主机(或服务器)上下文中不会按预期工作,因为指令在请求映射到文件系统之前处理,这与在目录(或.htaccess)上下文中使用时不同。在请求被映射到文件系统之前,REQUEST_FILENAME与 相同REQUEST_URI,即。根相对 URL 路径。

    但是,您可以使用前瞻来获取请求最终将映射到的绝对文件名。例如:

    RewriteCond %{LA-U:REQUEST_FILENAME} !-f
    RewriteCond %{LA-U:REQUEST_FILENAME} !-d
    
    • 1
  4. Cariri
    2010-06-08T17:48:17+08:002010-06-08T17:48:17+08:00
    RewriteCond     %{REQUEST_URI}     ^(/pathinfo/|/pathinfo)(.*)$
    RewriteRule     .*          %{DOCUMENT_ROOT}%{REQUEST_URI} [L]
    
    • 0

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve