Jump to content
  • 0

htaccess - выполнение одного из редиректов только один раз за весь цикл обработки условий / Apache


Tok13
 Share

Question

Здравствуйте!
У меня такой вопрос возник по причине того, что на моём хостинге, управляемым сервером apache, после имени домена можно добавить бесконечное число слешей, и сайт всё равно открывается.
Пример:

http://имя_моего_домена//////имя_директории

Хотелось бы убрать все эти слеши так, чтобы было перенаправление на страницу без слешей, т.е.

http://имя_моего_домена/имя_директории

Но проблема в том, что rewriterule правила не видят множество слешей именно после имени домена и избавиться от них можно, только пользуясь одним редиректом на ту же страницу (R=301).

В связи с этим вопрос. Если нельзя проверить никакие особые условия по содержанию самой uri, то каким ещё образом можно выполнить редирект только один раз во всём цикле обработки, а при возвращении к первому правилу обработки условий после редиректа просто пропускать существующий редирект каждый последующий раз?

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

 

типа того чтоль?

RewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_URI} ^(.+)/$RewriteRule ^(.+)/$ /$1 [R=301,L]

 

В Вашем коде по этим условиям обработаются абсолютно все ссылки, не являющиеся директориями, у которых на конце обнаружен слеш. Но мне нужно убрать слеш после имени домена или сделать перезагрузку страницы единожды, используя, возможно, переменные, но у меня лично условия переменных проверяются коряво.

Вообще, вот все условия по перенаправлениям моего файла .htaccess на данный момент:

 

RewriteEngine on
 
RewriteBase /
 
Options -Indexes +SymLinksIfOwnerMatch
 
#Отключить слеши для директорий
DirectorySlash Off
 
RewriteCond %{REQUEST_URI} .+/$ [NC,OR]
RewriteCond %{REQUEST_URI} 2+ [NC]
RewriteCond %{REQUEST_URI} !^(.*\.com/)?.*?/-$ [NC]
RewriteRule ^(.*\.com/)?(.+)$ $2/- [NC,L]
 
#Заменяем // на /
RewriteCond %{REQUEST_URI} ^(.*\.com/)?(.*?)/{2,}(.*?)(/-)?$ [NC]
RewriteRule (.*) %2/%3/- [NC,N,L]
 
#Обрезаем ссылку до недоступных символов
RewriteRule ^(.*\.com/)?(.*?)(\^|\{|\}|\`|\|).*?/?-?$ $2/- [NC,N,L]
 
#Убираем пробелы повторяющиеся с / после
RewriteRule ^(.*\.com/)?(.*?)/?(2+/)+2*(.*?)/?-?$ $2/$4/- [NC,N,L]
 
#Убираем пробелы повторяющиеся с / до
RewriteRule ^(.*\.com/)?(.*?)/?(?<![^/])(2+)(?=.+?/)(.*?)/?-?$ $2/$4/- [NC,N,L]
 
#Заменяем пробелы на чёрточки
RewriteRule ^(.*\.com/)?(.+?)2+(.+?)/?-?$ $2-$3/- [NC,N,L]
 
#Формируем итоговую обработанную ссылку без / на конце
RewriteRule ^(.*\.com/)?(.*?)/-$ /$2 [NC,R=301,L]
 
RewriteCond %{ENV:REDIRECT_FINISH} !^$
RewriteRule ^ - [L]
 
RewriteCond %{QUERY_STRING} ^.+$ [NC]
RewriteRule ^(.*?)\^(.?)$ /$1? [NC,R=301,L]
 
RewriteCond %{QUERY_STRING} ^$ [NC]
RewriteRule ^(.*\.com/)?(default\.html/?.*)$ /default.html?url=$2 [NC,QSA,L,E=FINISH:1]
 
RewriteCond %{REQUEST_URI} !^/default\.html/?.*$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-l [NC]
RewriteRule ^(.+)$ /default.html?url=$1 [NC,QSA,L,E=FINISH:1]

 

 

Всё прекрасно работает. На что тут следует обратить внимание, так это на часть кода:

#Заменяем // на /RewriteCond %{REQUEST_URI} ^(.*\.com/)?(.*?)/{2,}(.*?)(/-)?$ [NC]RewriteRule (.*) %2/%3/- [NC,N,L]

С помощью этого кода удаляются ВСЕ двойные пробелы (проверено), КРОМЕ тех, что стоят после имени домена, прямо за именем домена. Проверка будто их и не видит вовсе, а воспринимает это множество слешей после имени домена как один слеш, поэтому конкретные условия на множественные слеши после имени домена у меня просто не срабатывали. В соответствии с этим и вопрос... Как решить проблему и в чём может быть причина такого поведения? От множественного слеша после имени домена избавляет лишь редирект страницы на саму себя. Тогда вместо множества слешей образуются один. Но в таком случае проблема как раз в написании условия, потому что нет никаких отличительных особенностей такой REQUEST_URI, чтобы я мог единожды запустить этот редирект.

На двойку не обращайте внимания, потом заменю все двойки на символ пробела, это лишь для тестирования условий.

Edited by Tok13
Link to comment
Share on other sites

  • 0

1) ну к примеру яндексу на это дело наплевать, так почему вас так это волнует?

2) htaccess с таким вот кодом может сильно нагрузить серверные ресурсы, лучше через php обработать.

Link to comment
Share on other sites

  • 0

Иначе говоря, чисто средствами php я ведь не добьюсь единой точки входа в систему, потому что пользователь может ввести в адресной строке всё, что угодно, а это всё, что угодно сначала должно преобразоваться к ЧПУ в адресной строке, а потом уже все запросы должны перенаправиться на default.html, где уже пойдёт разбор ссылки из массива GET.

Если чисто средствами php, то не получится, потому что по этой схеме придётся на бесконечно возможном множестве вводимых страниц держать код php с перенаправлениями.

Если же отправлять все запросы сразу на главную страницу в параметре GET, не меняя ссылки в браузере, смысл опять теряется, потому что потом php всё равно это всё обработает и должен будет вновь перезагрузить страницу, чтобы .htaccess снова отправил на ту самую главную страницу то, что будет в адресной строке.

Конечно, так можно делать, но мне кажется, что перезагрузка страницы средствами php получится ещё медленнее.

Link to comment
Share on other sites

  • 0

Какой у вас ужас в htaccess творится. Вы мне кажется боретесь со следствием, а не с причиной.

 

проблема с кучей слешей? Может для начала выяснили бы почему вообще так происходит, а уж потом правила писали?

 

Нужна единая точка входа? Это делается элементарно:

RewriteEngine OnRewriteBase /RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php?query=$1 [L,QSA]

А уже потом в index.php разбирать запросы. И учитывая возможность кэширования в php это будет лучше чем непонятная писанина в htaccess

 

+ Все файлы кроме index.php защитить от прямого доступа.

Link to comment
Share on other sites

  • 0

Какой у вас ужас в htaccess творится. Вы мне кажется боретесь со следствием, а не с причиной.

 

проблема с кучей слешей? Может для начала выяснили бы почему вообще так происходит, а уж потом правила писали?

 

Нужна единая точка входа? Это делается элементарно:

 

+ Все файлы кроме index.php защитить от прямого доступа.

 

У меня это и сделано элементарно. Но перед этим я добиваюсь ЧПУ в адресной строке браузера. Я знаю, что можно всякую фигню направлять на индекс пхп, но для начала хочу все одиночные пробелы заменить на чёрточки, запретить ввод разных символов и заменить все многочисленные идущие подряд слеши на один.

Видимо, уже выяснил, но исходную причину назвать не могу. Кто-то пишет про особенности протокола HTTP/1.1 в одной из статей и про различия значения переменных request_uri в .htaccess и в php. Проверил, всё именно так. php видит многочисленные слеши, даже если они введены после имени домена, а вот .htaccess нет. 

Link to comment
Share on other sites

  • 0

по поводу чпу и пробелов, можно ведь и через php написать ф-цию а-ля:

function translited($string) {    $converter = array(        'а' => 'a',   'б' => 'b',   'в' => 'v',        'г' => 'g',   'д' => 'd',   'е' => 'e',        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',        'и' => 'i',   'й' => 'y',   'к' => 'k',        'л' => 'l',   'м' => 'm',   'н' => 'n',        'о' => 'o',   'п' => 'p',   'р' => 'r',        'с' => 's',   'т' => 't',   'у' => 'u',        'ф' => 'f',   'х' => 'h',   'ц' => 'c',        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',        'ь' => '\'',  'ы' => 'y',   'ъ' => '\'',        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',                'А' => 'A',   'Б' => 'B',   'В' => 'V',        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',        'И' => 'I',   'Й' => 'Y',   'К' => 'K',        'Л' => 'L',   'М' => 'M',   'Н' => 'N',        'О' => 'O',   'П' => 'P',   'Р' => 'R',        'С' => 'S',   'Т' => 'T',   'У' => 'U',        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',        'Ь' => '\'',  'Ы' => 'Y',   'Ъ' => '\'',        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',    );    return strtr($string, $converter);}function str2url($str) {    // переводим в транслит    $str = translited($str);    // в нижний регистр    $str = strtolower($str);	// заменям все ненужное нам на "-", а пробелы на "_"	$str = preg_replace('/[^a-z0-9_]+/', '_', str_replace(' ', '_', $str));    // удаляем начальные и конечные '-' и '_'    $str = trim($str, "-_");    return $str;}
Link to comment
Share on other sites

  • 0

Спасибо огромное за подсказку, rus)) Просто я в php не профессионал, это только на слабом средненьком уровне, поэтому и не знал, что могу с помощью php проверить именно request_uri (то, что введено в адресной строке) и в соответствии с этим склеить страницы. Думал, что SCRIPT_NAME в этом случае совпадает с REQUEST_URI, и всё это зациклится, но оказалось, что средствами php организовать то, что я хочу, намного проще. Эти переменные принимают разные значения, поэтому я спокойно с помощью htaccess могу направлять сразу все запросы на одну страницу default.html, а на ней уже проверять request_uri и в зависимости от этого осуществлять перенаправление.

Спасибо вам большое за наводку))) Как будет код, напишу сюда то, что получилось)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By belhost
      Всем привет!
      Бесплатная консультация по серверам и вопросам настроек, обращайтесь.
      Помогу чем смогу
      ————————————————————————————————
      Также предоставляю услуги:
      - Помощь c серверными рещениями при открытие IT проектов
      - Большой опыт в готовых IT решений для Вашего бизнеса
      - Подбор конфигурации сервера и размещение серверов
      - Регистрация и установка SSL и TLS а также Let's Encrypt
      - Оптимизация сервера под HighLoad. Nginx, PPH-FPM, HHTP2
      - Администрирование Ubuntu, Debian, Centos, Fedora, RedHat
      - Администрирование и мониторинг Windows Server 03/08/12
      - Установка панелей Plesk, ISP manager 4/5, DA, Vesta, WebMin
      - Установка систем виртуализации KVM, OpenVZ, VMWare, Hyper
      - Настройка сервера под Bitrix, WP, Joomla, Drupal, Yii, OpenCart
      - Установка и настройка мониторинга Munin, Nagios, Zabbix, Cacti
      - Гео распределенная фильтрация DDOS атак до 1000Gb/s
      - Организация системы Бэкапирования FTP, ЯД, DropBox, NAS
      - Мониторинг за состоянием сервера и его служб 24х7
      - Оперативное вмешательство при сбоях в работе служб сервера
      - Экстренное обращение к администратору 24х7 по телефону
      - Удаляем трояны/бэкдоры, спамботы, взломщики паролей
      - Удаляем программы-шпионы, DoS/DDoS агенты, iframe вставки
      - Удаляем рекламные блоки и прочие угрозы вашему сайту
      - Сервер БД MySQL, MsSQL, PostgresSQL, MariaDB, Percona
      - Общение с Тех Поддержкой Вашей хостинговой площадкой
      - Установка и настройка proxy сервера на базе Squid, 3proxy, l2tp
      - Установка и настройка почтового сервера Postfix, Exim, SendMail
      - Настройка цифровых подписей почты DKIM, SPF, DMARC, PTR
      - Настройка и установка VPN сервера PPTP, IPSec, L2Tp, OpenVPN
      - Настройка и установка сервера на AWS Amazon EC2, DigitalOcean
      - Администрирование и создание контейнеров Docker
      - Настройка и установка централизованного администрирование Ansible, RunDeck
      ————————————————————————————————
      Мои профили и отзывы на Биржах:
      FL.ru
      Weblancer
      freelancehunt
      freelance.ru
      5bucks.ru
      linkedin.com
      ————————————————————————————————
      Мои контакты:
      Сайт BEL-HOST | SKYPE: sys_admin3 | WhatsApp: +375256122681 | VIBER: +375256122681 | TELEGRAM: @gev511 |
    • By Sergey2510
      https://proverka1.000webhostapp.com/
      На пк сайт отлично работает, а на сервере не запускает css файлы : wp-content/plugins/fullpage172/fullpage/nav/section/filled-circles.css@ver=2.9.2 ; Перерыл весь интернет и не нашел ответа.Помогите )
    • By Владимир Горинов
      Не подключается файл .htaccess( закинул его на хостинг, но гугл спид так и не показывает что файлы кэшируються - вот сам код htaccess
      <ifModule mod_expires.c> # Add correct content-type for fonts AddType application/vnd.ms-fontobject .eot AddType application/x-font-ttf .ttf AddType application/x-font-opentype .otf AddType application/x-font-woff .woff AddType image/svg+xml .svg # Compress compressible fonts AddOutputFilterByType DEFLATE application/x-font-ttf application/x-font-opentype image/svg+xml ExpiresActive On ExpiresDefault "access plus 5 seconds" # Cache Images ExpiresByType image/x-icon "access plus 2592000 seconds" ExpiresByType image/jpeg "access plus 2592000 seconds" ExpiresByType image/png "access plus 2592000 seconds" ExpiresByType image/gif "access plus 2592000 seconds" ExpiresByType image/svg+xml "access plus 2592000 seconds" # Cache Fonts ExpiresByType application/vnd.ms-fontobject "access plus 2592000 seconds" ExpiresByType application/x-font-ttf "access plus 2592000 seconds" ExpiresByType application/x-font-opentype "access plus 2592000 seconds" ExpiresByType application/x-font-woff "access plus 2592000 seconds" ExpiresByType image/svg+xml "access plus 2592000 seconds" # Cache other content types (Flash, CSS, JS, HTML, XML) ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds" ExpiresByType text/css "access plus 604800 seconds" ExpiresByType text/javascript "access plus 2592000 seconds" ExpiresByType application/javascript "access plus 2592000 seconds" ExpiresByType application/x-javascript "access plus 2592000 seconds" ExpiresByType text/html "access plus 600 seconds" ExpiresByType application/xhtml+xml "access plus 600 seconds" </ifModule> <ifModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript </ifModule> Подскажите откуда  ноги расстут, и какой процент что это проблемы с ненастраенным апач на хостинге?

    • By Youradmin
      Любой сервер, даже самый мощный или не очень, нуждается в постоянном мониторинге и обслуживании, т.к. от его работы зависит репутация Вашего проекта.
      Предоставляю комплексные услуги по обслуживанию и поддержке работы серверов любых проектов:
      1. Мониторинг работы сервера.
      2. Оповещение о любых проблемах с сервером на email, sms, jabber.
      3. Бекап сервера на удаленное хранилище или Ваш Ядиск.
      4. Скидка всем пользователям данного форума 30%
      5. Большой опыт работы, более 12 лет занимаюсь администрированием серверов.
      Ознакомиться с тарифами можно по ссылке Your-admin.pro
      К каждому клиенту, персональный подход.
      Обращайтесь, обсудим детали и цены.
       0
    • By Anechka
      Привет! На сайте есть страница которая обрабатывает 404 ошибки (допустим она называется 404.html) и всё вроде бы работает отлично но вот если обратиться к этой странице напрямую то ответ сервера будет "200 ОК" и это не правильно. Как с помощью .htaccess сделать так чтобы и при прямом обращении был Not Found? Способ послать на этой странице свой PHP заголовок Not Found не интересует и запрет индексирования этой страницы в meta или robots.txt тоже. Мне интересно узнать - можно ли это реализовать только через .htaccess? Спасибо!
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy