Apache .htaccess并从未知父目录中的子目录重写

Apache .htaccess并从未知父目录中的子目录重写,apache,.htaccess,redirect,mod-rewrite,Apache,.htaccess,Redirect,Mod Rewrite,因此,我在子目录中有一个htaccess文件,每当我试图重写url时,它都会重定向到文档的根目录,而不是htaccess所在的子目录。现在,在正常情况下,我会用path/to/subdirectory的子目录路径重写它,但我不知道确切的路径是什么。有没有办法通过Apache环境变量或其他方式写出该路径 编辑: 这是迄今为止的.htaccess文件 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME}

因此,我在子目录中有一个htaccess文件,每当我试图重写url时,它都会重定向到文档的根目录,而不是htaccess所在的子目录。现在,在正常情况下,我会用
path/to/subdirectory
的子目录路径重写它,但我不知道确切的路径是什么。有没有办法通过Apache环境变量或其他方式写出该路径

编辑: 这是迄今为止的
.htaccess
文件

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d
    #RewriteRule (.*-file) a/b/c/$1.file
    RewriteRule (.*-file) $1.file
因此,我试图,如果请求包含单词
文件
,我想在单词文件之前匹配整个请求并重定向到那里。这样,如果请求是

    example.com/a/b/c/file[any characters here].file
请求将被重定向到正确的文件。重申一下,问题是我试图在子目录内重定向。所以当我说Rewrite$1时,我希望它包括整个请求,而不仅仅是请求文件名中匹配的内容。我之所以需要它,是因为我不能简单地把
a/b/c/$1.file
放进去,因为我无法绝对确定
a/b/c
部分

编辑2:示例: 例如,我会发送如下请求:

    example.com/a/b/c/fileacs.file
并希望重定向到:

    example.com/a/b/c/file.file
在那里我不知道a/b/c/。我有一个实际的正则表达式和一套规则来实际使用这个重定向,所以不要介意这个例子的荒谬性

但目前它正在重定向到:

    example.com/file.file

这是不存在的,即使它存在,我也不想重定向到那里。我读过关于重写上下文的内容,但找不到任何实质性的内容,也找不到它是否是造成这种情况的原因。提前谢谢。

您可以使用此规则捕获
fileacs.file
之前的任何路径,并将其用作
重写规则中的巴赫参考:

RewriteEngine On

RewriteCond ^(.*)/file[^.]+\.file$ [NC]
RewriteRule ^ %1/file.file [L,R=302]

解决方案是在%{REQUEST_URI}(感谢anubhava!)上使用重写条件,检查是否匹配除了%{REQUEST_FILENAME}之外的整个请求,而不使用前瞻性捕获它。用%1和所需的文件名写出此文件。见下文:

    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_URI} (.*)-file(?!\.file) [NC]
    RewriteRule ^ %1.file [L,R=301]

%1现在保存到存储.htaccess的目录的路径,以及文件名的任何前缀。这与请求的其余部分不匹配,而是查看头部以确保您没有实际请求要重定向到的文件(导致循环)。

您能显示您的.htaccess吗?@anubhava我必须在家,但我会确保编辑我的主要帖子,以显示我到目前为止所获得的信息。@anubhava我编辑帖子是为了增加清晰度和上下文。请给出一个例子:1)匹配的路径(例如
a/b/c/file
),2)应该重写什么,3)当前重写什么。Thx@anubhava.htaccess位于子目录中。所以它位于example.com/a/b/c。它和file.file在同一个目录中。您的回答让我接近了我的解决方案,但它也与我试图省略的请求部分相匹配,但非常感谢!我只是想用我的正则表达式捕捉我不知道的路径。