IIS 404 Пользовательская Ошибка: код ответа 200 возврата URL вместо этого

Я пытаюсь возвратить пользовательские 404 страницы с помощью IIS6. (У меня есть сайт, который является главным образом .shtml страницами, созданными с помощью подвижного типа). Я попробовал его 2 пути:

1) установите 404 обработчика ошибок в IIS, чтобы быть типом "файл" с путем \404.html. Это работает, но это также означает, что я не могу импортировать заголовок и нижний колонтитул моего сайта (следовательно .shtml) Пытающийся указать на 404 обработчика ошибок на 404.shtml результаты в значении по умолчанию 404 страницы... я предполагаю, что IIS не может обработать shtml файлы в 404.

2) установите тип на "URL". Это работает отлично, за исключением того, что код ответа больше не 404! Это - 200.

Как я могу заставить IIS отвечать 404 кодами ответа с содержанием моего 404.shtml файл?

6
задан Joel 26 February 2010 в 21:43
поделиться

2 ответа

Учитывая, что это IIS, добавление

<% Response.Status = "404 Not Found" %>

в начало 404.shtml должно изменить код ответа на 404.

Я не использую Windows-машину, поэтому я не могу сейчас протестировать его, чтобы проверить.

Обновление:

Я наконец-то смог запустить несколько тестов на IIS 6. Как вы упомянули в комментарии к моему сообщению, файл .shtml не позволяет запускать команды сценария. Таким образом, есть по крайней мере два способа обойти это:

  1. Вместо того, чтобы называть пользовательскую страницу обработки 404 404.shtml , назовите ее 404.asp . Пользователь никогда не должен видеть фактическое имя страницы, поэтому это не должно вызывать никаких проблем. Обратите внимание, что для параметра «Активные серверные страницы» необходимо установить значение «Разрешено» в папке «Расширения веб-службы» IIS.

  2. Измените сопоставление расширения страницы для .shtml, чтобы использовать asp.dll вместо ssinc.dll. Вы можете сделать это из IIS, выбрав веб-сайт и просмотрев «Свойства» -> вкладка «Домашний каталог» -> «Конфигурация» -> вкладка «Сопоставления». Обратите внимание, что это далеко не идеальное решение, потому что теперь все ваши файлы .shtml будут обрабатываться asp.dll . Это может привести к тому, что ваши страницы будут отображаться медленнее (предполагается, что asp.dll обрабатывает файлы медленнее, чем ssinc.dll из-за большей сложности), и нарушает принцип наименьших привилегий .

Если ни один из вариантов не подходит для вашей ситуации, то это все еще возможно, но решение не сразу для меня очевидно.

6
ответ дан 17 December 2019 в 02:27
поделиться

Я понимаю, что .NET является основой для поддержки языков программирования, а не языком. Существует Visual Basic .NET , Visual C .NET и т.д.

Я предлагаю продолжить работу с C и C++, так как вы никогда не узнаете, когда .NET будет заменен другой технологией. Пока что C и C++ медленно меняются и требуют, чтобы консорциум одобрил изменения в языке. Вы также не можете ограничивать себя и изучать другие полезные языки, такие как Java, Perl, PHP и LISP. Я очень предлагаю LISP, так как он полностью отличается от C или C++ и просветит вас.

-121--2182177-

Свойство Text используется при редактировании ComboBox. Можно задать сообщение типа «Select» по умолчанию, добавив элемент в ControlTemplate, который отображается только при отсутствии выбора и затем исчезает. С помощью этого метода не нужно беспокоиться об изменении коллекции или попытке пользователя выбрать сообщение «Select» из списка, так как оно не является частью списка. Рекомендуется использовать тэг для установки сообщения на каждом экземпляре или в стиле, а затем добавить новый TextBlock, чтобы отобразить его в шаблоне по умолчанию:

<TextBlock x:Name="SelectMessage" HorizontalAlignment="Left" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" Visibility="Collapsed"/>

Затем его можно использовать следующим образом:

<ComboBox ItemsSource="{Binding MyList}" Template="{StaticResource ComboBoxMessageTemplate}" Tag="Select days..."/>

Вот полная копия шаблона Aero ComboBox, сгенерированная Blend, с изменениями. Также потребуется пространство имен темы (xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero") и ссылка на сборку PresentationFramework.Aero:

<Geometry x:Key="DownArrowGeometry">M 0 0 L 3.5 4 L 7 0 Z</Geometry>
<Style x:Key="ComboBoxReadonlyToggleButton" TargetType="{x:Type ToggleButton}">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="IsTabStop" Value="false"/>
    <Setter Property="Focusable" Value="false"/>
    <Setter Property="ClickMode" Value="Press"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
                <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}">
                    <Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
                        <Path x:Name="Arrow" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center" Data="{StaticResource DownArrowGeometry}"/>
                    </Grid>
                </Microsoft_Windows_Themes:ButtonChrome>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="true">
                        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ControlTemplate x:Key="ComboBoxMessageTemplate" TargetType="{x:Type ComboBox}">
    <Grid x:Name="MainGrid" SnapsToDevicePixels="true">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
        </Grid.ColumnDefinitions>
        <Popup x:Name="PART_Popup" Margin="1" AllowsTransparency="true" IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Grid.ColumnSpan="2">
            <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}" Color="Transparent">
                <Border x:Name="DropDownBorder" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1">
                    <ScrollViewer CanContentScroll="true">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.DirectionalNavigation="Contained"/>
                    </ScrollViewer>
                </Border>
            </Microsoft_Windows_Themes:SystemDropShadowChrome>
        </Popup>
        <ToggleButton Style="{StaticResource ComboBoxReadonlyToggleButton}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" IsHitTestVisible="false" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"/>
        <TextBlock x:Name="SelectMessage" HorizontalAlignment="Left" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" Visibility="Collapsed"/>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="SelectedItem" Value="{x:Null}">
            <Setter Property="Visibility" TargetName="SelectMessage" Value="Visible"/>
        </Trigger>
        <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
            <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
            <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
        </Trigger>
        <Trigger Property="HasItems" Value="false">
            <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
            <Setter Property="Background" Value="#FFF4F4F4"/>
        </Trigger>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
-121--4779866-

В диспетчере IIS откройте раздел Свойства веб-сайта (или виртуального каталога) и перейдите на вкладку Пользовательские ошибки. Там можно задать, какой файл отправляется в случае каждого кода ошибки, включая 404.

0
ответ дан 17 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: