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

时间:2016-08-04 21:42:58

标签: apache .htaccess redirect mod-rewrite

所以我在子目录中有一个htaccess文件,每当我尝试重写url时,它都会重定向到document_root而不是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

所以,我正在尝试,如果请求包含单词file,我想在单词文件之前匹配整个请求并重定向。如果请求是

,那就是这样
    example.com/a/b/c/file[any characters here].file

请求将被重定向到正确的文件。重申一下,问题是我试图在子目录中重定向。因此,当我说Rewrite $ 1时,我想要包含整个请求,而不仅仅是REQUEST_FILENAME中匹配的内容。我需要这样做的原因是因为我不能简单地提出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

哪个不存在,即使它确实存在,我也不想重定向。我已经阅读过有关重写上下文的内容,但是无法找到任何有关它的实质内容,也不是它的原因。提前谢谢你。

2 个答案:

答案 0 :(得分:2)

您可以使用此规则捕获fileacs.file之前的任何路径,并将其用作RewriteRule中的bach-reference:

RewriteEngine On

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

答案 1 :(得分:0)

解决方法是在%{REQUEST_URI}上使用RewriteCond(感谢anubhava!),它使用前瞻检查匹配除{%{REQUEST_FILENAME}之外的整个请求而不捕获它。用%1后跟所需的文件名写出来。请参阅以下内容:

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

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