Apache .htaccess相对请求URI重定向

时间:2012-02-22 20:04:54

标签: apache .htaccess redirect request relative

首先,我有以下目录结构:

  • / project_directory / rewriting_experimentation_directory
    • htaccess文件
    • realfile.txt

我想要做的是:

当用户请求http://domain.xts/.../rewriting_experimentation_directory/falsename时, 应显示realfile.txt。我已经实现了,使用.htaccess文件中的以下表达式:

RewriteEngine On
RewriteRule   ^falsename$  realfile.txt

但是,当用户请求此网址http://domain.xts/.../rewriting_experimentation_directory/realfile.txt时,我也在努力实现这一目标, 他被重定向到http://domain.xts/.../rewriting_experimentation_directory/falsename,然后自然地显示了realfile.txt的内容。

但我遇到了两个问题:

  1. 首先,Redirect 301,RedirectMatch,Alias等都需要 绝对的pathes,而不是相对于目录的那些 .htaccessfile是。这是完全不可接受的,因为 当我将目录上传到domain.xts(或其他任何地方)时,目录rewriting_experimentation_directory之前的路径与localhost上的路径不同
  2. 其次,它与请求的网址不匹配,但我将称之为“响应”网址的网址,即其网址的名称内容Apache正在返回客户端。因此,如果我尝试从realfile.txt重定向到falsename,我会得到一个无限循环。 (遗憾的是,加载需要一点时间)。
  3. 有没有办法实现这个目标?

    另外,作为问题的答案,'为什么你需要那个?' - 学习,一次,其次,以备将来参考(可能仍然算作学习)。我希望这不会使我的问题无效。

1 个答案:

答案 0 :(得分:3)

尝试在RewriteRule之前添加:

RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ (.*)/realfile.txt\ HTTP
RewriteRule ^realfile.txt$ %2/falsename [R=301,L]

如果您只是使用RewriteRule(括号中的 R )重定向,这会有一些问题,它会导致重写循环并且您会收到错误。您需要检查实际请求是否为“realfile.txt”。正则表达式(.*)/realfile.txt尝试提取相对URI,它将是.htaccess文件所在的位置(否则这些条件/规则根本不会被执行),因为我们不知道它是什么是的,我们可以使用RewriteRule中的%2 来反向引用它。

因此,如果您将.htaccess文件放在/test/并请求http://yourdomain/test/realfile.txt,您将被重定向到http://yourdomain/test/falsename,您的重写规则将提供realfile.txt。如果您将.htaccess文件放在/deploy/并请求http://yourdomain/deploy/realfile.txt,则会将您重定向到http://yourdomain/deploy/falsename等。