анализатор браузера iPad / iPhone с mod_rewrite и перенаправлением; "слишком много перенаправлений" - PullRequest
2 голосов
/ 27 февраля 2011

Я пытаюсь создать браузерный анализатор для версии Mobile Safari, проблема в том, что перенаправление создает бесконечный цикл, и мне интересно, есть ли способ сделать это:

http://mydomain.com (или любой другой Requets_uri) [301] -> http://mydomain.com/ipad

Вот фрагмент, который я использую:

RewriteCond %{REQUEST_URI} !^ipad #Trying to set the condition "if /ipad is not the request_uri, but it doesn't work
RewriteCond %{HTTP_USER_AGENT} .*Mobile.*Safari
RewriteRule ^(.*)$ ipad [R=301,L]

Обновление : Вот мой (измененный) полный набор правил mod_rewrite:

RewriteEngine On RewriteBase /

# iOS redirection.
RewriteCond %{REQUEST_URI} !^/ipad
RewriteCond %{HTTP_USER_AGENT} .*Mobile.*Safari
RewriteRule ^(.*)$ /ipad [R=301,L]

# If the requested URL does not exist (it's likely an agavi route),
# pass it as path info to index.php, the Agavi dispatch script.
RewriteRule ^$ index.php?/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}      !^/favicon.ico
RewriteRule (.*) index.php?/$1 [QSA,L]

Обновление 2 : ФИНАЛ; Благодаря ответам, я пришел к следующему решению, которое я публикую для тех, у кого есть такие же проблемы:

RewriteEngine On
RewriteBase /

# iOS redirection.
# Make sure the URL hasn't already been rewritten internally
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_URI} !^/ios
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}      !^/favicon.ico
RewriteCond %{HTTP_USER_AGENT} .*Mobile.*Safari
RewriteRule ^.*$ /ios [R,L]

# If the requested URL does not exist (it's likely an agavi route),
# pass it as path info to index.php, the Agavi dispatch script.
RewriteRule ^$ index.php?/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}      !^/favicon.ico
RewriteRule (.*) index.php?/$1 [QSA,L]

1 Ответ

2 голосов
/ 27 февраля 2011

Тест в вашем первом RewriteCond всегда будет успешным, потому что значение %{REQUEST_URI} всегда начинается с косой черты вперед и, следовательно, никогда не может начинаться только с «ipad». Попробуйте изменить его следующим образом:

RewriteCond %{REQUEST_URI} !^/ipad
RewriteCond %{HTTP_USER_AGENT} .*Mobile.*Safari
RewriteRule ^(.*)$ /ipad [R=301,L]

Также хорошей идеей будет поставить косую черту перед «ipad» из-за вашего внешнего перенаправления, как я уже там делал. Если вы установили RewriteBase, это не будет проблемой, но вы, вероятно, столкнетесь с проблемами в противном случае из-за того, как mod_rewrite генерирует новый запрос.

Редактировать : Проблема, с которой вы сталкиваетесь с вашим полным набором правил, связана с тем, что значение %{REQUEST_URI} изменится после вашего второго блока правил, что приведет к повторному выполнению первого условия когда набор правил перерабатывается. Этот шаг повторной обработки является частью того, как mod_rewrite работает в контексте каталога , поэтому вы должны принять это во внимание. К счастью, это не сложно сделать:

RewriteEngine On
RewriteBase /

# iOS redirection.
# Make sure the URL hasn't already been rewritten internally
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_URI} !^/ipad
RewriteCond %{HTTP_USER_AGENT} .*Mobile.*Safari
RewriteRule ^(.*)$ /ipad [R=301,L]

# If the requested URL does not exist (it's likely an agavi route),
# pass it as path info to index.php, the Agavi dispatch script.
RewriteRule ^$ index.php?/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}      !^/favicon.ico
RewriteRule (.*) index.php?/$1 [QSA,L]
...