RewriteRule вызывает перезагрузку страницы дважды - PullRequest
6 голосов
/ 10 мая 2011

Я сформировал два разных RewriteRules для своей страницы:

# Enable URL Rewriting
RewriteEngine on

# exclude followed stuff
RewriteRule ^(js|img|css|favicon\.ico|image\.php|anprobe|content|libs|flash\.php|securimage)/ - [L,QSA,S=2]

# conditions (REQUEST dont point @ file|dir|link)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-F
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# rules
RewriteRule ^(?!index\.php)brillen/(.*(brillen)|360|neu)/(.*)([a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(?!\.))(.*)$     /index.php/brillen/$1?art_id=$4&$5&%{QUERY_STRING}      [NS,QSA,L]
RewriteRule ^(?!index\.php)(.*)$                                                            /index.php/$1                                   [NS,QSA,L]

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

У кого-нибудь есть идеи по этому поводу?

Заранее спасибо!

Примечание 1: Все запрошенные ресурсы действительны и доступны в соответствии с отслеживанием ресурсов в браузере.

Примечание 2: Может ли проблема возникать при сохранении и последующей обработке PATH_INFO?(/index.php/$1 => /index.php/foo/bar/...)

Ответы [ 3 ]

8 голосов
/ 10 мая 2011

Механизм перезаписи не может выполнить один HTTP-запрос дважды . Он направляет HTTP-запрос для Apache в статический файл, прокси-функцию или модуль (например, PHP) с изменением в запросе. Но он не может клонировать запрос и передать его 2 раза в apache.

Если у вас есть проблема "дважды запустить", есть вероятность, что вы столкнулись с ошибкой URL-адреса пустого изображения . На самом деле это не ошибка, это особенность HTML (по крайней мере, до HTML5) и функция парсинга URL.

Если вы получаете где-нибудь пустой GET url , HTML сообщает, что браузер должен повторно отправить тот же запрос (тот, который дал ему текущую страницу) с теми же параметрами. Это может сделать запрос POST 2 раза (если запрошенная 1-я страница была POST). Так, где эти пустые GET URL? В большинстве случаев вы получаете либо:

<IMG SRC="" ...> (in the HTML)

или

url() (in the css)

или

<script type="text/javascript" src=""></script>
<link rel="stylesheet" type="text/css" href=""> (in the HTML headers)

Читайте также @Jon ответ о запросе favicon. Вы всегда должны проверять результат без поведения браузера, используя запросы wget или telnet 80.

Обновление: подробные объяснения и продолжение доступны на этом блоге с добавлениями HTML5, которые должны устранить это поведение для современных браузеров.

1 голос
/ 10 июня 2013

У меня была та же проблема, вызванная тем, что я переписал URL, и скрипт загружался дважды, потому что я не добавил это:

RewriteRule ^(js|img|css|favicon\.ico)/ - [L,QSA,S=2]

Это остановит скриптбыть загруженным дважды;это решило мою проблему.

1 голос
/ 20 мая 2011

У меня была такая же проблема (или я так думал).Это вызвано запросом favicon.ico, который я не учел в своем правиле перезаписи.

...