.htaccess RewriteCond用于现有和不存在的文件

时间:2015-07-26 14:01:35

标签: .htaccess mod-rewrite redirect

我正在尝试使用.htaccess将某个子路径的所有url请求(“URL / somefolders / main / ..”)重定向到名为“_index.php”的一个基本文件。所以我将以下.htaccess实现到“文件夹” URL / somefolders / main /

Dim ValBeforeChange as String

Private Sub Worksheet_SelectionChange(ByVal Target as Range)
    ValBeforeChange = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
    If Not Len(ValBeforeChange) > 0 Then Exit Sub
    If Target.Value = ValBeforeChange Then Exit Sub
    Dim KeyCells As Range
    Set KeyCells = Range("A:A")
    If Application.Intersect(KeyCells, Target) Is Nothing Then Exit Sub
    Highlight Target
End Sub

Sub Highlight(ByRef Target as Range)
    With Target.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 255
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

重定向适用于所有不存在的文件,但如果文件存在,则调用它而不重定向。我想这是因为我命令“!”这样做。在RewriteCond中,但我所有尝试改变它都失败了。

如何更改上述代码以重定向所有文件(是否存在)?

修改

我的所有尝试仍然无效或错误。 后者带有Apache日志错误:

<IfModule mod_rewrite.c> DirectoryIndex index.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^?]*)$ /main/_index.php?oldpath=$1 [NC,L,QSA] </IfModule>

目前我担心事实上我在之前的大部分尝试中都正确地允许了不存在的文件,但由于包含文件而导致我无限循环的问题 - 这可能吗?如果是这样,.htaccess可以区分“内部”和“外部”文件请求吗?

1 个答案:

答案 0 :(得分:1)

您的原始规则是您将看到的最常见的实现,其中REQUEST_FILENAME检查现有文件或目录,以防止重写CSS和图像等内容。但那不是你想要的。

因此,您正确地尝试删除RewriteCond指令,但结果是无限重写循环。这可能是因为后续的RewriteRule也试图将_index.php重写回自身。

您可以通过添加与RewriteCond特别匹配的_index.php来解决此问题,以防止其自行循环。

<IfModule mod_rewrite.c>
DirectoryIndex index.php
RewriteEngine on
# Don't apply the rewrite to _index.php to prevent looping
RewriteCond %{REQUEST_URI} !main/_index\.php
RewriteRule ^([^?]*)$ /main/_index.php?oldpath=$1 [NC,L,QSA]
</IfModule>

我还将简化RewriteRule中的匹配组。 ([^?]*)会捕获第一个?之前的所有内容,但RewriteRule收到的表达式绝不会包含查询字符串或?。您可以简单地使用(.*)来捕获存在的任何内容。

RewriteRule (.*) /main/_index.php?oldpath=$1 [NC,L,QSA]