powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / (.htaccess) Странный редирект. Часть 2
25 сообщений из 28, страница 1 из 2
(.htaccess) Странный редирект. Часть 2
    #38865993
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё один тест. Более актуальный. В корневой папке сайта имеется каталог awstats . Внутри него файла .htaccess нет (доступ свободный).

Задача: При запросе каталога awstats или любого файла внутри него должен выполняться внутренний редирект на главную страницу сайта + в параметре need передаётся запрошенный uri . Т.е. должны выполняться следующие внутренние редиректы:

1) " www.site.ru/awstats " => " www.site.ru/process.php?need=awstats "
2) " www.site.ru/awstats/ " => " www.site.ru/process.php?need=awstats/ "
3) " www.site.ru/awstats/file1.html " => " www.site.ru/process.php?need=awstats/file1.html "

Решение:
В корневом .htaccess указываем директивы:
Код: sql
1.
2.
3.
RewriteEngine On
RewriteBase /
RewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]


Что получаем:
При запросе " www.site.ru/awstats " (без слэша) выполняется внешний редирект на " www.site.ru/awstats/?need=awstats " (меняется адрес в браузере). При этом на сервере:
а) физически выполняется корневой скрипт process.php
б) url, который получает сервер, равен " www.site.ru/awstats/?need=awstats "

При запросе " www.site.ru/awstats/ " (со слешем) никаких проблем не наблюдается (выполняется внутренний редирект на " www.site.ru/process.php/?need=awstats ").

P.S. Описанный артефакт наблюдается временами в Firefox , Opera и Safari . И никогда не наблюдается в Chrome . Что ЭТО ?
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866078
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите обмен заголовками. Если действительно с сервера приходит 301 или 302 код (которого не должно быть, по идее) - забыть про глюки браузеров и внимательно смотреть в серверный код.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866543
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас и в Chrome та же проблема.

1) Посмотрел заголовки в Firefox
=================================
GET ?need=awstats 404 Not Found site.ru
Заголовки запроса
GET /awstats/?need=awstats HTTP/1.1
Host: www.site.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: ...
Connection: keep-alive

Заголовки ответа
HTTP/1.1 404 Not Found
Date: Thu, 29 Jan 2015 09:04:35 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3768
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Содержимое ответа - 404 страница, которую генерирует мой php-скрипт
GET www.site.ru - 200 OK - site.ru
Заголовки запроса
GET / HTTP/1.1
Host: www.site.ru
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.site.ru/awstats/?need=awstats
Cookie: ...
Connection: keep-alive

Заголовки ответа
HTTP/1.1 200 OK
Date: Thu, 29 Jan 2015 09:04:38 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 4992
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Содержимое ответа : в Firefox отображается надпись "Перезагрузите страницу, чтобы получить источник для http://www.site.ru/" (после перезагрузки страницы (без очистки сетевой консоли) надпись сохраняется)
(далее ajax-запросы, счётчики и пр.)


2) Посмотрел заголовки в Chrome
===============================
awstats * GET * 301 Moved Permanently * text/html * Initiator : Other * Size (content) : (from cache)
Request URL: http://www.site.ru/awstats/?need=awstats
Request Method:GET
Status Code:404 Not Found

Заголовки запроса
GET /awstats/?need=awstats HTTP/1.1
Host: www.site.ru
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: ...

Заголовки ответа
HTTP/1.1 404 Not Found
Date: Thu, 29 Jan 2015 09:00:44 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3545
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Содержимое ответа : в Chrome отображается надпись " Failed to load responce data "
?need=awstats/awstats * GET * 404 Not Found * text/html * Initiator : http://www.site.ru/awstats Redirect * Size (content) : 3.9?KB 14.7?KB
Request URL: http://www.site.ru/awstats/?need=awstats
Request Method:GET
Status Code:404 Not Found

Заголовки запроса
GET /awstats/?need=awstats HTTP/1.1
Host: www.site.ru
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: ...

Query String Parameters
need:awstats

Заголовки ответа
HTTP/1.1 404 Not Found
Date: Thu, 29 Jan 2015 09:00:44 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze19
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3545
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Содержимое ответа - 404 страница, которую генерирует мой php-скрипт
(далее загружаются изображения, ajax-запросы, счётчики и пр.)


3) Проверил также на другом компьютере в Firefox (на котором awstats ещё ни разу не запрашивался) - тот же артефакт.
====================================================================================================================
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866549
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как видно из заголовков, и состав заголовков, и их последовательность отличается для Firefox и Chrome.
Причём в Chrome имеет место 301-й редирект, которого нет в случае с Firefox.

В общем, просмотрев заголовки, я ничего не понял. Бред какой-то...
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866595
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02в Chrome имеет место 301-й редиректВ приведённых здесь заголовках код 301 отсутствует.
Если же он действительно приходит - ищите, кто его формирует. Вариантов немало. Это может быть .htaccess директории обращения, любой из родительских директорий, конфиги виртхоста, вебсервера и, наконец, какой-то скрипт (которому случайно перепадает счастье обработать этот запрос). Может ещё чего пропустил.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866647
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ приведённых здесь заголовках код 301 отсутствует. Заголовки первого запроса Chrome'а я указал неверно (по ошибке скопировал заголовки 2-го запроса)
Первый запрос хрома такой:

awstats * GET * 301 Moved Permanently * text/html * Initiator: Other * Size (content): (from cache)
Remote Address: адрес_моего_сервера :80
Request URL: http://www.site.ru/awstats
Request Method:GET
Status Code:301 Moved Permanently (from cache)

Request Headers
Provisional headers are shown
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36

Response Headers
Content-Encoding:gzip
Content-Length:257
Content-Type:text/html; charset=iso-8859-1
Date:Thu, 29 Jan 2015 08:57:46 GMT
Location: http://www.site.ru/awstats/?need=awstats
Server:Apache/2.2.16 (Debian)
Vary:Accept-Encoding

------------------------------------------------------------------------------------------------------------------------------------------------
Причём элемента "view source" (просмотр исходного текста заголовков) в хроме у этих заголовков нет. Тогда как у всех других заголовков можно переключаться "view parsed" <=> "view source"
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866649
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Плюс этот самый первый запрос Хрома на вкладке "Request" сопровождается надписью " Failed to load responce data "
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866656
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли же он действительно приходит - ищите, кто его формирует.Все заголовки я выложил. Можно ли по ним определить, приходит 301-й редирект или нет ?
Хроме первым запросом вроде как получает 301 редирект. Но содержимое ответа показать не может. Что за хрень ?
В Firefox никаких 301 ответов нет: первым запросом получаем 404 ответ, а второй запрос Firefox - это запрос главной страницы сайта (слэш). Где тут логика ?
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866757
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПлюс этот самый первый запрос Хрома на вкладке "Request" сопровождается надписью "Failed to load responce data" Это оттого, что 301 ответ не содержит данных. Только заголовки. Здесь всё нормально.

авторПричём элемента "view source" (просмотр исходного текста заголовков) в хроме у этих заголовков нет. Тогда как у всех других заголовков можно переключаться "view parsed" <=> "view source" Как оказалось, при первой загрузке страницы барузеры кэшируют 301 редирект и при последующих загрузках самостоятельно реализуют этот же редирект (меняют адрес на тот, что запомнили в кэше). Именно поэтому в 301 ответе, который показывает Хром:
а) присутствовала надпись "from cache"
б) Хром не мог показать исходный текст ответа (не было переключателя "view parsed" <=> "view source" )

Но проблему это наблюдение не решает. Даже после полной очистки кэша/истории при загрузке страницы www.site.ru/awstats получаем реальный 301 редирект от сервера на www.site.ru/awstats/?need=awstats со всеми вытекающими:
авторHTTP/1.1 301 Moved Permanently
Date: Thu, 29 Jan 2015 11:46:49 GMT
Server: Apache/2.2.16 (Debian)
Location: http://www.site.ru/awstats/?need=awstats
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 257
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866806
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идём дальше. Перед каждой тестовой загрузкой страницы теперь очищаю кэш и историю Хрома. В итоге всегда получаю актуальный (реальный) 301 редирект (без всяких кэшей).

В данных условиях выяснил следующее:
1) При запросе www.site.ru/xxx (без слэша) в случае наличия на сервере одноимённого каталога получаем внешний 301 редирект на www.site.ru/awstats/xxx/ (со слэшем). Обратного редиректа (при запросе каталога и при наличии одноимённого файла) не наблюдается.

2) Этот "умный" редирект (с добавлением слэша) не выполняется корневым .htaccess (если его удалить или очистить, слэш по-прежнему добавляется). Внутри awstats файла .htaccess нет. Следовательно, этот "умный" 301 редирект выполняет:
а) либо сам Apache
б) либо где-то прописан. Где именно - не нашёл. Проверил файлы /etc/apache2/apache2.conf , /etc/apache2/httpd.conf - там его нет.

3) Добавление фрагмента ?need=awstats выполняет мой собственный редирект:
Код: sql
1.
RewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]

Если его закомментировать, то при запросе www.site.ru/awstats (без слэша) получаем 301 редирект на www.site.ru/awstats/ , а не www.site.ru/awstats/?need=awstats


Из этого всего следует вывод:
Есть некий неуловимый "умный" внешний 301 редирект , который добавляет слэш при запросе без слэша (если существует каталог). Назовём его RedirectX . И есть мой внутренний редирект RewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA] .

При запросе www.site.ru/awstats/ (со слешем):
а) мой редирект выполняется
б) RedirectX не выполняется (т.к. слэш присутствует)
В итоге поведение сервера не вызывает вопросов - выполняется мой внутренний редирект на index.php?need=awstats , как и положено.

При запросе www.site.ru/awstats (без слеша):
а) мой редирект выполняется
б) RedirectX тоже выполняется
Здесь происходит самое интересное. RedirectX - это внешний 301 редирект (добавлется слэш). Мой редирект - это внутренний редирект ( index.php?need=$1 ). При совмещении этих двух редиректов получаем внешний 301 редирект с добавлением слэша и с добавлением ?need=$1 .


Т.е. необходимо решить 2 задачи:
1) Локализовать/идентифицировать RedirectX
2) Объяснить таинственный механизм слияния RedirectX и моего редиректа
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866884
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. при запросе www.site.ru/awstats (без слэша) получаем следующую последовательность запросов и ответов:

1) Браузер запрашивает www.site.ru/awstats (без слэша)
2) На сервере срабатывают оба редиректа - внешний RedirectX и мой внутренний редирект
3) Сервер возвращает 301 редирект с указанием location = www.site.ru/awstats/?need=awstats
4) Браузер сразу же запрашивает www.site.ru/awstats/?need=awstats
5) На сервере срабатывает только мой внутренний редирект на process.php?need=awstats
6) Сервер возвращает страницу, сгенерированную скриптом process.php?need=awstats с успешным статусом 200

В качестве временного решения изменил свой редирект с
Код: sql
1.
RewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]

на
Код: sql
1.
RewriteRule ^(awstats\/.*)$ process.php?need=$1 [L,QSA]

Т.е. убрал вариант awstats без слэша.

В итоге при запросе www.site.ru/awstats (без слэша) получаем следующую последовательность запросов и ответов:

1) Браузер запрашивает www.site.ru/awstats (без слэша)
2) На сервере срабатывает только внешний RedirectX
3) Сервер возвращает 301 редирект с указанием location = www.site.ru/awstats/
4) Браузер сразу же запрашивает www.site.ru/awstats/
5) На сервере срабатывает только мой внутренний редирект на process.php?need=awstats/
6) Сервер возвращает страницу, сгенерированную скриптом process.php?need=awstats/ с успешным статусом 200

--------------------------------------------------------------------------------------------------------------
Но в любом случае необходимо вычислить RedirectX и механизм его взаимодействия с моим редиректом
Код: sql
1.
RewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38866948
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02необходимо вычислить RedirectX Обычно в случае непоняток поочерёдно отключаю/комментирую директивы конфигов, имеющие какое-то отношение к проблеме. Это строчки в .htaccess, да и ещё в самом апачевском конфиге, у которого бывают инклюды...


Cyrax_02Перед каждой тестовой загрузкой страницы теперь очищаю кэш и историю Хрома.Попробуйте консольный wget с ключиком -d. На мой взгляд, сильно упрощает жизнь в подобных случаях.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867019
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОбычно в случае непоняток поочерёдно отключаю/комментирую директивы конфигов, имеющие какое-то отношение к проблеме. Это строчки в .htaccess, да и ещё в самом апачевском конфиге, у которого бывают инклюды... http://phpclub.ru/talk/threads/ЧПУ-Добавление-слэша-в-конце.22262/#post-195722
http://toster.ru/q/12959

Как указано по последней ссылке, это DirectorySlash .
В файле конфигурации /etc/apache2/apache2.conf у меня этой директивы не прописано. B .htaccess тоже. Но судя по всему, работает его "умолчательное" значение, равное On .

Для отключения директивы достаточно прописать:
а) либо в конфигурационном файле Apache:
Код: sql
1.
2.
3.
4.
<Location /some/path>
    DirectorySlash Off
    SetHandler some-handler
</Location> 

б) либо в .htaccess :
Код: sql
1.
2.
DirectorySlash Off
SetHandler some-handler


Только вот если отключить эту директиву, то при наличии внутреннего редиректа
Код: sql
1.
rewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]

запросы www.site.ru/awstats (без слэша) или www.site.ru/awstats/ (со слэшем) приводят к тому, что php-код скрипта process.php целиком вываливается на страницу браузера (при этом url не меняется, как и должно быть).

Посему вывод: отключать директиву нельзя ни в коем случае.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867040
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТолько вот если отключить эту директиву, то при наличии внутреннего редиректа
Код: sql
1.
rewriteRule ^(awstats|awstats\/.*)$ process.php?need=$1 [L,QSA]

запросы www.site.ru/awstats (без слэша) или www.site.ru/awstats/ (со слэшем) приводят к тому, что php-код скрипта process.php целиком вываливается на страницу браузера (при этом url не меняется, как и должно быть).

Посему вывод: отключать директиву нельзя ни в коем случае.
А при наличии редиректа
Код: sql
1.
rewriteRule ^(script.php)$ process.php?need=$1 [L,QSA]

на запросе www.site.ru/script.php (без слэша) на страницу вываливается содержимое скрипта script.php

Как объяснить эти 2 артефакта ?
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867113
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если директиву DirectorySlash оставить включенной, то имеем следующие проблемы:
1) При запросе www.site.ru/script.php/ (со слешем) Apache выполняет внутренний редирект на файл script.php (как будто запросили www.site.ru/script.php без слэша)

2) При наличии внутреннего редиректа (каталог "catalog" существует)
Код: sql
1.
rewriteRule ^(catalog|catalog\/.*)$ script.php?need=$1 [L,QSA]

и при запросе www.site.ru/catalog (без слеша) Apache:

а) применяет свой внешний редирект (добавление слэша) в отношении внешнего url (который был запрошен клиентом), а не в отношении внутреннего url (который получается после отработки внутренних редиректов, прописанных в .htaccess), как это должно быть согласно здравой логике

б) на свой внешний редирект (добавление слэша) непонятным образом накладывает внутренний редирект
Код: sql
1.
rewriteRule ^(catalog|catalog\/.*)$ script.php?need=$1 [L,QSA]

так, что конечный url для 301 редиректа превращается не в www.site.ru/catalog/ (со слешем), а в www.site.ru/catalog/?need=catalog


Для сравнения: редирект
Код: sql
1.
rewriteRule ^(catalog|catalog\/.*)$ script.php?need=$1 [L,QSA]

выполняет внутреннее перенаправление с www.site.ru/catalog (без слеша) на www.site.ru/script.php?need=catalog
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867115
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Apache добавляет слэш (301 редирект со слешем) именно после отработки всех правил, прописанных в .htaccess. Потому что:
1) Если в .htaccess прописать любой 301 редирект (с опцией L ), то сработает именно он, а не редирект Apache (добавление слэша)
2) Если в .htaccess вместо правила
Код: sql
1.
rewriteRule ^(catalog|catalog\/.*)$ script.php?need=$1 [L,QSA]

оставить только вариант со слешем:
Код: sql
1.
rewriteRule ^(catalog\/.*)$ script.php?need=$1 [L,QSA]

то сабжевого артефакта наблюдаться не будет: наш редирект не сработает. Следовательно, к моменту выполнения нашего редиректа внутренний url равен www.site.ru/catalog (без слэша), а не www.site.ru/catalog/ (со слешем) (в последнем случае наш редирект сработал бы и наблюдался бы сабжевый артефакт)

Ну а коли Apache выполняет свой редирект (добавляет слэш) после всех наших редиректов, прописанных в .htaccess , то он должен корректировать именно внутренний url, который получается после наших внутренних редиректов. Фактически же Apache всё равно корректирует внешний url, запрошенный клиентом.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867124
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА если директиву DirectorySlash оставить включенной, то имеем следующие проблемы:
1) При запросе www.site.ru/script.php/ (со слешем) Apache выполняет внутренний редирект на файл script.php (как будто запросили www.site.ru/script.php без слэша)Немного вру. Если запрашивается каталог, а существует файл, то слэш убирается тем же самым внешним редиректом.

Т.е. директива DirectorySlash и добавляет слэш, и удаляет слэш, когда это необходимо. И в обоих случаях выполняет внешний 301 редирект.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867149
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02авторА если директиву DirectorySlash оставить включенной, то имеем следующие проблемы:
1) При запросе www.site.ru/script.php/ (со слешем) Apache выполняет внутренний редирект на файл script.php (как будто запросили www.site.ru/script.php без слэша)Немного вру. Если запрашивается каталог, а существует файл, то слэш убирается тем же самым внешним редиректом.

Т.е. директива DirectorySlash и добавляет слэш, и удаляет слэш, когда это необходимо. И в обоих случаях выполняет внешний 301 редирект.
Снова вру. Всё несколько сложнее:

* При включенной директиве DirectorySlash и при наличии в .htaccess редиректа
rewriteRule ^(script.php|script.php\/.*)$ process.php?need=$1 [L,QSA]
Apache выполняет внутренний редирект с www.site.ru/script.php/ (со слешем) на файл script.php

* При включенной директиве DirectorySlash и при отсутствии нашего редиректа Apache выполняет внешний редирект с www.site.ru/script.php/ (со слешем) на файл www.site.ru/script.php (без слэша)
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867154
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вывод: директива DirectorySlash по умолчанию работает так:
Если существует файл, слэш убирает. Если существует каталог, слэш добавляет. В обоих случаях 301 редирект является внешним.

Но если в файле .htaccess добавить внутренний редирект (даже с опцией L ) с запрашиваемого существующего файла/каталога на другой существующий файл, то Apache начинает вести себя неадекватно:

1) Выполняет внутренний редирект с www.site.ru/script.php/ (со слешем) на файл script.php . При этом наш редирект никак не срабатывает

2) Выполняет внешний редирект с www.site.ru/catalog (со слешем) на www.site.ru/catalog/?need=catalog , слепив тем самым в кучу дерьма свой редирект (добавление слэша) и наш редирект (добавление ?need=catalog )
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867184
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02б) либо в .htaccess :
Код: sql
1.
2.
DirectorySlash Off
SetHandler some-handler

Что-то намешали. SetHandler - это совсем другая тема. Главным образом, для поддержки обработки скриптов. Потому скрипт и вываливается в виде текста, не передаваясь в программу php.


Cyrax_021) Выполняет внутренний редирект с www.site.ru/script.php/ (со слешем) на файл script.php .Внутренний ли? Больше на внешний похоже, через отдачу 301 кода клиенту.


Cyrax_02При этом наш редирект никак не срабатываетВероято, до нашего редиректа просто не доходит очередь.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867212
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧто-то намешали. SetHandler - это совсем другая тема. Главным образом, для поддержки обработки скриптов. Потому скрипт и вываливается в виде текста, не передаваясь в программу php.Да, действительно. Вываливалось у меня из-за SetHandler'а. Просто в примере он торчал - вот я его и скопировал машинально.

А DirectorySlash Off у меня и не применяется вообще (в .htaccess).
Т.е. для отключения DirectorySlash через .htaccess его там непонятно как нужно указывать. Просто DirectorySlash Off его не отключает...

авторCyrax_021) Выполняет внутренний редирект с www.site.ru/script.php/ (со слешем) на файл script.php .Внутренний ли? Больше на внешний похоже, через отдачу 301 кода клиенту.Нет, именно внутренний (без 301 редиректа). Т.е. адрес не меняется, но фактически выполняется скрипт script.php

авторCyrax_02При этом наш редирект никак не срабатываетВероято, до нашего редиректа просто не доходит очередь.Возможно.
Но ведь в случае запроса www.site.ru/catalog (без слэша) Apache слэш добавляет (через 301 редирект), но при этом до нашего редиректа дело доходит - 301 редирект выполняется не на www.site.ru/catalog/ , а на www.site.ru/catalog/?need=catalog .

Как Вы это объясните ?
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867224
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз всё протестировал. Вот итоговый результат.
При включенной директиве DirectorySlash по умолчанию Apache ведёт себя следующим образом:

1) При существовании файла script.php выполняет внутренний редирект (адрес в браузере не меняется) с www.site.ru/script.php/ (со слешем) на этот файл ( www.site.ru/script.php ). Т.е. при запросе каталога выдаёт файл без изменения url
2) При существовании каталога catalog выполняет внешний 301 редирект (адрес в браузере меняется) с www.site.ru/catalog (без слеша) на www.site.ru/catalog/ (со слешем)


* Далее. Если в .htaccess прописать редирект, который перенаправляет с script.php/ (со слешем) на другой существующий файл:
Код: sql
1.
rewriteRule ^(script.php\/.*)$ process.php?need=$1 [L,QSA]

то Apache выполняет уже внешний 301 редирект (адрес в браузере меняется) с www.site.ru/script.php/ (со слешем) на www.site.ru/script.php (без слеша). Т.е. наличие нашего редиректа меняет поведение Apache при добавлении слэша: вместо внутреннего редиректа он уже выполняет внешний.


** Если в .htaccess прописать редирект, который перенаправляет с существующего catalog (без слэша) на другой существующий файл:
Код: sql
1.
rewriteRule ^(catalog)$ process.php?need=$1 [L,QSA]

то Apache с www.site.ru/catalog (без слэша) выполняет тот же внешний 301 редирект (добавление слэша), но уже c частичным выполнением нашего редиректа: перенаправляет не на www.site.ru/catalog/ , а на www.site.ru/catalog/?need=catalog


Как объяснить * и ** , я не знаю.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867228
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Но ведь в случае запроса www.site.ru/catalog (без слэша) Apache слэш добавляет (через 301 редирект), но при этом до нашего редиректа дело доходит - 301 редирект выполняется не на www.site.ru/catalog/ , а на www.site.ru/catalog/?need=catalog .

Как Вы это объясните ?Как понимаю, должно быть так. Вот отдался клиенту 301 редирект на УРЛ с добавленным слешем. На этом работа вебсервера по данному запросу закончена. Апач про него забыл. Далее браузер выполняет новый запрос. И этот новый запрос будет обработан "с нуля". Это, как я понимаю работу вебсервера. Однако, я не слишком силён в приоритетах применения Апачем различных директив конфигурирования и моё мнение нельзя считать истиной в последней инстанции. Возможно, и рерайт и добавление слеша происходят за один цикл внутренней обработки. Сходу в доках не нашел информацию об этом.
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867234
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак понимаю, должно быть так. Вот отдался клиенту 301 редирект на УРЛ с добавленным слешем. На этом работа вебсервера по данному запросу закончена. Апач про него забыл. Далее браузер выполняет новый запрос. И этот новый запрос будет обработан "с нуля". Это, как я понимаю работу вебсервера.Всё именно так. Всё что я здесь пишу, касается самого первого такого запроса.

авторВозможно, и рерайт и добавление слеша происходят за один цикл внутренней обработки. Сходу в доках не нашел информацию об этом. Если под "циклом внутренней обработки" Вы понимаете один "запрос-ответ", то в каждом таком цикле все правила и редиректы применяются с нуля. Другое дело, что в первом запросе - один url, во втором - другой (если на первый запрос получен редирект).
В сабже всё касается только первого такого цикла "запрос-ответ".

В своём последнем топике "Ещё раз всё протестировал. Вот итоговый результат" я описал первый "запрос-ответ".
...
Рейтинг: 0 / 0
(.htaccess) Странный редирект. Часть 2
    #38867243
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Если под "циклом внутренней обработки" Вы понимаете один "запрос-ответ"Да, именно один запрос-ответ, точнее, _набор_ и, что немаловажно, _последовательность_ правил (заданных директивами), которые будут применены к URL.

Например, при обработке mod_rewrite (тут для упрощения предположу, что все другие директивы отсутствуют) сам по себе URL будет изменён. А "на выходе" из модуля возможны варианты. Если присутствует модификатор вроде [R=301] - то будет выполнен внешний редирект. Тут всё просто и понятно. Если же модификатора нет - то далее Апач просто будет обрабатывать этот новый, изменённый URL (по сути, внутри модуля произошла замена одного адреса на дугой).

А вот как будут взаимодействовать DirectorySlash (mod_dir) и RewriteRule (mod_rewrite) в одном флаконе, кто из них и как именно успеет отработать - это лично мне далеко не слишком очевидно и понятно.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / (.htaccess) Странный редирект. Часть 2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]