|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Ещё один тест. Более актуальный. В корневой папке сайта имеется каталог 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.
Что получаем: При запросе " 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 . Что ЭТО ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2015, 22:01 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Посмотрите обмен заголовками. Если действительно с сервера приходит 301 или 302 код (которого не должно быть, по идее) - забыть про глюки браузеров и внимательно смотреть в серверный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 00:00 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Сейчас и в 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 / 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/" (после перезагрузки страницы (без очистки сетевой консоли) надпись сохраняется) 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 " 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-скрипт 3) Проверил также на другом компьютере в Firefox (на котором awstats ещё ни разу не запрашивался) - тот же артефакт. ==================================================================================================================== ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 12:44 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Как видно из заголовков, и состав заголовков, и их последовательность отличается для Firefox и Chrome. Причём в Chrome имеет место 301-й редирект, которого нет в случае с Firefox. В общем, просмотрев заголовки, я ничего не понял. Бред какой-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 12:47 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Cyrax_02в Chrome имеет место 301-й редиректВ приведённых здесь заголовках код 301 отсутствует. Если же он действительно приходит - ищите, кто его формирует. Вариантов немало. Это может быть .htaccess директории обращения, любой из родительских директорий, конфиги виртхоста, вебсервера и, наконец, какой-то скрипт (которому случайно перепадает счастье обработать этот запрос). Может ещё чего пропустил. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 13:08 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторВ приведённых здесь заголовках код 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" ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 13:41 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Плюс этот самый первый запрос Хрома на вкладке "Request" сопровождается надписью " Failed to load responce data " ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 13:45 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторЕсли же он действительно приходит - ищите, кто его формирует.Все заголовки я выложил. Можно ли по ним определить, приходит 301-й редирект или нет ? Хроме первым запросом вроде как получает 301 редирект. Но содержимое ответа показать не может. Что за хрень ? В Firefox никаких 301 ответов нет: первым запросом получаем 404 ответ, а второй запрос Firefox - это запрос главной страницы сайта (слэш). Где тут логика ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 13:49 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторПлюс этот самый первый запрос Хрома на вкладке "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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 14:49 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Идём дальше. Перед каждой тестовой загрузкой страницы теперь очищаю кэш и историю Хрома. В итоге всегда получаю актуальный (реальный) 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.
Если его закомментировать, то при запросе 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 и моего редиректа ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 15:17 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Т.е. при запросе 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.
на Код: sql 1.
Т.е. убрал вариант 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 16:14 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Cyrax_02необходимо вычислить RedirectX Обычно в случае непоняток поочерёдно отключаю/комментирую директивы конфигов, имеющие какое-то отношение к проблеме. Это строчки в .htaccess, да и ещё в самом апачевском конфиге, у которого бывают инклюды... Cyrax_02Перед каждой тестовой загрузкой страницы теперь очищаю кэш и историю Хрома.Попробуйте консольный wget с ключиком -d. На мой взгляд, сильно упрощает жизнь в подобных случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 16:54 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторОбычно в случае непоняток поочерёдно отключаю/комментирую директивы конфигов, имеющие какое-то отношение к проблеме. Это строчки в .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.
б) либо в .htaccess : Код: sql 1. 2.
Только вот если отключить эту директиву, то при наличии внутреннего редиректа Код: sql 1.
запросы www.site.ru/awstats (без слэша) или www.site.ru/awstats/ (со слэшем) приводят к тому, что php-код скрипта process.php целиком вываливается на страницу браузера (при этом url не меняется, как и должно быть). Посему вывод: отключать директиву нельзя ни в коем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 17:46 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторТолько вот если отключить эту директиву, то при наличии внутреннего редиректа Код: sql 1.
запросы www.site.ru/awstats (без слэша) или www.site.ru/awstats/ (со слэшем) приводят к тому, что php-код скрипта process.php целиком вываливается на страницу браузера (при этом url не меняется, как и должно быть). Посему вывод: отключать директиву нельзя ни в коем случае. А при наличии редиректа Код: sql 1.
на запросе www.site.ru/script.php (без слэша) на страницу вываливается содержимое скрипта script.php Как объяснить эти 2 артефакта ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 17:58 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
А если директиву DirectorySlash оставить включенной, то имеем следующие проблемы: 1) При запросе www.site.ru/script.php/ (со слешем) Apache выполняет внутренний редирект на файл script.php (как будто запросили www.site.ru/script.php без слэша) 2) При наличии внутреннего редиректа (каталог "catalog" существует) Код: sql 1.
и при запросе www.site.ru/catalog (без слеша) Apache: а) применяет свой внешний редирект (добавление слэша) в отношении внешнего url (который был запрошен клиентом), а не в отношении внутреннего url (который получается после отработки внутренних редиректов, прописанных в .htaccess), как это должно быть согласно здравой логике б) на свой внешний редирект (добавление слэша) непонятным образом накладывает внутренний редирект Код: sql 1.
так, что конечный url для 301 редиректа превращается не в www.site.ru/catalog/ (со слешем), а в www.site.ru/catalog/?need=catalog Для сравнения: редирект Код: sql 1.
выполняет внутреннее перенаправление с www.site.ru/catalog (без слеша) на www.site.ru/script.php?need=catalog ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:39 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Apache добавляет слэш (301 редирект со слешем) именно после отработки всех правил, прописанных в .htaccess. Потому что: 1) Если в .htaccess прописать любой 301 редирект (с опцией L ), то сработает именно он, а не редирект Apache (добавление слэша) 2) Если в .htaccess вместо правила Код: sql 1.
оставить только вариант со слешем: Код: sql 1.
то сабжевого артефакта наблюдаться не будет: наш редирект не сработает. Следовательно, к моменту выполнения нашего редиректа внутренний url равен www.site.ru/catalog (без слэша), а не www.site.ru/catalog/ (со слешем) (в последнем случае наш редирект сработал бы и наблюдался бы сабжевый артефакт) Ну а коли Apache выполняет свой редирект (добавляет слэш) после всех наших редиректов, прописанных в .htaccess , то он должен корректировать именно внутренний url, который получается после наших внутренних редиректов. Фактически же Apache всё равно корректирует внешний url, запрошенный клиентом. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:40 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторА если директиву DirectorySlash оставить включенной, то имеем следующие проблемы: 1) При запросе www.site.ru/script.php/ (со слешем) Apache выполняет внутренний редирект на файл script.php (как будто запросили www.site.ru/script.php без слэша)Немного вру. Если запрашивается каталог, а существует файл, то слэш убирается тем же самым внешним редиректом. Т.е. директива DirectorySlash и добавляет слэш, и удаляет слэш, когда это необходимо. И в обоих случаях выполняет внешний 301 редирект. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 18:48 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
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 (без слэша) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 19:10 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Вывод: директива 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 ) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 19:14 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Cyrax_02б) либо в .htaccess : Код: sql 1. 2.
Что-то намешали. SetHandler - это совсем другая тема. Главным образом, для поддержки обработки скриптов. Потому скрипт и вываливается в виде текста, не передаваясь в программу php. Cyrax_021) Выполняет внутренний редирект с www.site.ru/script.php/ (со слешем) на файл script.php .Внутренний ли? Больше на внешний похоже, через отдачу 301 кода клиенту. Cyrax_02При этом наш редирект никак не срабатываетВероято, до нашего редиректа просто не доходит очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 19:45 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторЧто-то намешали. 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 . Как Вы это объясните ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 20:23 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Ещё раз всё протестировал. Вот итоговый результат. При включенной директиве 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.
то Apache выполняет уже внешний 301 редирект (адрес в браузере меняется) с www.site.ru/script.php/ (со слешем) на www.site.ru/script.php (без слеша). Т.е. наличие нашего редиректа меняет поведение Apache при добавлении слэша: вместо внутреннего редиректа он уже выполняет внешний. ** Если в .htaccess прописать редирект, который перенаправляет с существующего catalog (без слэша) на другой существующий файл: Код: sql 1.
то Apache с www.site.ru/catalog (без слэша) выполняет тот же внешний 301 редирект (добавление слэша), но уже c частичным выполнением нашего редиректа: перенаправляет не на www.site.ru/catalog/ , а на www.site.ru/catalog/?need=catalog Как объяснить * и ** , я не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 20:54 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Cyrax_02Но ведь в случае запроса www.site.ru/catalog (без слэша) Apache слэш добавляет (через 301 редирект), но при этом до нашего редиректа дело доходит - 301 редирект выполняется не на www.site.ru/catalog/ , а на www.site.ru/catalog/?need=catalog . Как Вы это объясните ?Как понимаю, должно быть так. Вот отдался клиенту 301 редирект на УРЛ с добавленным слешем. На этом работа вебсервера по данному запросу закончена. Апач про него забыл. Далее браузер выполняет новый запрос. И этот новый запрос будет обработан "с нуля". Это, как я понимаю работу вебсервера. Однако, я не слишком силён в приоритетах применения Апачем различных директив конфигурирования и моё мнение нельзя считать истиной в последней инстанции. Возможно, и рерайт и добавление слеша происходят за один цикл внутренней обработки. Сходу в доках не нашел информацию об этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 21:00 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
авторКак понимаю, должно быть так. Вот отдался клиенту 301 редирект на УРЛ с добавленным слешем. На этом работа вебсервера по данному запросу закончена. Апач про него забыл. Далее браузер выполняет новый запрос. И этот новый запрос будет обработан "с нуля". Это, как я понимаю работу вебсервера.Всё именно так. Всё что я здесь пишу, касается самого первого такого запроса. авторВозможно, и рерайт и добавление слеша происходят за один цикл внутренней обработки. Сходу в доках не нашел информацию об этом. Если под "циклом внутренней обработки" Вы понимаете один "запрос-ответ", то в каждом таком цикле все правила и редиректы применяются с нуля. Другое дело, что в первом запросе - один url, во втором - другой (если на первый запрос получен редирект). В сабже всё касается только первого такого цикла "запрос-ответ". В своём последнем топике "Ещё раз всё протестировал. Вот итоговый результат" я описал первый "запрос-ответ". ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 21:09 |
|
(.htaccess) Странный редирект. Часть 2
|
|||
---|---|---|---|
#18+
Cyrax_02Если под "циклом внутренней обработки" Вы понимаете один "запрос-ответ"Да, именно один запрос-ответ, точнее, _набор_ и, что немаловажно, _последовательность_ правил (заданных директивами), которые будут применены к URL. Например, при обработке mod_rewrite (тут для упрощения предположу, что все другие директивы отсутствуют) сам по себе URL будет изменён. А "на выходе" из модуля возможны варианты. Если присутствует модификатор вроде [R=301] - то будет выполнен внешний редирект. Тут всё просто и понятно. Если же модификатора нет - то далее Апач просто будет обрабатывать этот новый, изменённый URL (по сути, внутри модуля произошла замена одного адреса на дугой). А вот как будут взаимодействовать DirectorySlash (mod_dir) и RewriteRule (mod_rewrite) в одном флаконе, кто из них и как именно успеет отработать - это лично мне далеко не слишком очевидно и понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2015, 21:40 |
|
|
start [/forum/topic.php?fid=25&fpage=26&tid=1481901]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 191ms |
0 / 0 |