如何使正则表达式nginx位置工作?

时间:2017-03-08 20:37:23

标签: regex nginx

我的nginx配置中有以下位置:

<TreeView Grid.Column="0" Width="Auto" Background="Aquamarine" ItemsSource="{Binding Scenes}" 
                  SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeView.DataContext>
        <viewModels:ScenesViewModel />
    </TreeView.DataContext>
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:SceneViewModel}" ItemsSource="{Binding Characters}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding SceneName}"></TextBlock>
                <Image Source="{StaticResource ImgWorld}" Margin="0,0,5,0" Width="32" Height="32"/>
            </StackPanel>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:CharacterViewModel}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding FirstName}"></TextBlock>
                <Border BorderThickness="1" Background="RoyalBlue">
                    <Image Source="{Binding ImgIcon}" Margin="2"/>
                </Border>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

我正在尝试将/ api与最新版本匹配,并将/&lt; version&gt; / api与其他任何内容匹配。非正则表达位置工作正常,但我在另一个位置得到403.

我认为这与正在提供的文件和权限无关,因为如果我尝试访问

,我会收到403
server {
    listen       80;
    server_name  localhost;

    location ~ ^/(?!api)(.*)/api {
        alias /var/www/api/$1;
    }

    location /api {
        alias /var/www/api/latest;
    }

即使这些文件与

提供的文件相同
/latest/api

有没有人知道为什么我会收到403?

nginx错误是:

/api

1 个答案:

答案 0 :(得分:2)

问题不在于正则表达式,而是在正则表达式alias中使用location指令。有关详情,请参阅this document

在相关说明中,您应该使用前缀^~上的location修饰符,而不是使用否定前瞻断言。有关详情,请参阅this document

例如:

location ~ ^(/[^/]+)/api(.*)$ {
    alias /var/www/api$1$2;
}

location ^~ /api {
    alias /var/www/api/latest;
}