Задать вопрос
@Snooper

Отключить 302 перенаправление, если страница не существует (404), в Apache?

Суть проблемы:
При открытии ссылки на несуществующую страницу вида domain.tld/test_page сразу отдаётся статус 404
При открытии ссылки на несуществующую страницу вида domain.tld/test_page/ (слеш в конце) сначала происходит редирект 302 на этот же адрес без слеша и добавляется статус 404.
Каким образом можно избежать появления статуса 302 для несуществующих страниц открываемых со слешем в конце?
Все существующие ссылки, при этом должны продолжать перенаправляться с версий со слешем на версии без слеша.
Содержимое .htaccess
Options -Indexes
ErrorDocument 404 /404.php

<IfModule mod_php5.c>
        php_flag allow_call_time_pass_reference 1
        php_flag session.use_trans_sid off

        #php_value display_errors 1

        #php_value mbstring.internal_encoding UTF-8
</IfModule>

<IfModule mod_rewrite.c>
ErrorDocument 404 /404.php
        Options +FollowSymLinks
        RewriteEngine On

      #delete www
       RewriteCond %{HTTP_HOST} ^www\.(.*)$
        RewriteRule ^(.*)$ http://%1/$1 [L,R=301]


#RewriteCond %{REQUEST_URI} ^/404/$
#RewriteRule ^(.*)$ /404.php [L]

        #RewriteCond %{REQUEST_URI} ^/404
        #RewriteRule . - [R=404,L]
         
        #redirect from slash
        RewriteCond %{REQUEST_URI} (.+)/$
        RewriteRule ^ %1 [R,L]
        
        RewriteCond %{REQUEST_URI} ^.*[^/]$
        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}/index.php -f
        RewriteRule ^(.*)$ /$1/index.php [L]


        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-l
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
        RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
        RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

</IfModule>

<IfModule mod_dir.c>
        DirectorySlash Off
        DirectoryIndex index.php index.html
</IfModule>

<IfModule mod_expires.c>
        ExpiresActive on
        ExpiresByType image/jpeg "access plus 3 day"
        ExpiresByType image/gif "access plus 3 day"
</IfModule>


Содержимое 404.php
<?
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');

CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

$APPLICATION->SetTitle("404 Not Found");
?>

    <div class="wrap_nofind_search">
        <div class="top_nofind_search">
            <h2>404 Страница не найдена</h2>

            <p>Извините, запрошенная Вами страница не найдена</p>
        </div>

    </div>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");


301284cdafb742799b269d025efc3ddb.png
  • Вопрос задан
  • 2396 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 1
castomi
@castomi
Серверный администратор - tickets.settin.ru
Порассуждаем логически. У Вас стоит переадресация с без слеша на слеш, и она будет срабатывать везде. Ей всё равно есть страница или её нет. Но выход всё таки есть. Эту переадресацию можно делать не средствами apache, а средствами php, которое сможет проверить существует страница или нет и если не существует отдать 404, а если существует отдать 302)
Я конечно могу ошибаться и возможно это всё таки может сделать апач, но я не представляю как. А вот как это сможет сделать nginx у меня есть идея. Хотя я её не проверял.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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