Проблема обнаружения пустого REQUEST_URI с Apache mod_rewrite - PullRequest
6 голосов
/ 16 апреля 2011

Я использую Apache с правилом перенаправления, например:

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

Это успешно перенаправляет http://1st -domain.com в http://2nd -domain.com Однако, когда REQUEST_URI пусто, я хочу перенаправить на третий домен.

RewriteCond %{HTTP_HOST} ^1st-domain\.com$
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*)$ http://3rd-domain.com$1 [R=permanent,L]

Но это не работает и вместо этого перенаправляет на 2nd-domain.com

Мои правилаупорядочены так:

RewriteCond %{HTTP_HOST} ^1st-domain\.com$
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*)$ http://3rd-domain.com$1 [R=permanent,L]

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

Есть предложения?Заранее благодарим.

ОБНОВЛЕНИЕ

  1. Пусто REQUEST_URI: http: /1st-domain.com
  2. Непустое REQUEST_URI: http://1st -domain.com / что-то

Первое правило должно направлять пустой request_uri на 3rd-domain.com, второе правило должно направлять непустой request_uri в 2nd-domain.com

ПОЛЕЗНАЯ TIDBIT Вы можете включить отладку mod_rewrite с помощью этого фрагмента:

<IfModule mod_rewrite.c>
RewriteLog "/home/domain.com/logs/rewrite.log"
RewriteLogLevel 3
</IfModule>

Очень полезная опция отладки, которую я не знал.

Ответы [ 8 ]

9 голосов
/ 21 апреля 2011

Я использую следующее, чтобы поймать пустое REQUEST_URL:

RewriteEngine on

RewriteCond %{REQUEST_URI} "^/$"

RewriteRule ^(.*) http://%{HTTP_HOST}/my/another/url

9 голосов
/ 16 апреля 2011

Это должно работать:

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^$ http://3rd-domain.com [R=permanent,L]

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^(.+)$ http://2nd-domain.com/$1 [R=permanent,L]

Надеюсь, это поможет!

Примечание: REQUEST_URI немного отличается между httpd.conf и .htaccess, он начинается с дополнительной обратной косой черты в httpd.conf,Это означает, что в httpd.conf первое правило перезаписи должно быть ^\/$, а не просто ^$.

2 голосов
/ 28 июня 2013

Это должно работать:

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]
RedirectMatch ^/$ http://3rd-domain.com 
0 голосов
/ 04 мая 2016

Это сработало для меня:

RewriteCond %{HTTP_HOST} ^(www\.)?1st-domain\.com$
RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* http://3rd-domain.com/ [L,R=permanent]

RewriteCond %{HTTP_HOST} ^.*$
RewriteRule .* http://2nd-domain.com%{REQUEST_URI} [L,R=permanent]

без кавычек в пустой проверке

0 голосов
/ 28 января 2015

Я попробовал варианты, указанные на этой странице, все, что я хотел, это проверить, является ли REQUEST_URI пустым (или в данном конкретном случае, /):

# Check of the request uri is just 1 char long (checking for a slash was harder):
RewriteCond %{REQUEST_URI} ^.$
0 голосов
/ 23 июня 2013

Если запрос пуст, apache «перенаправляет» на index.html, так что -RewriteCond% {REQUEST_URI} index- может вам помочь.

0 голосов
/ 13 марта 2013

У меня на мультисайтах такое перенаправление работает для пустых запросов:

RewriteCond %{HTTP_HOST} ^1st-domain\.com$
RewriteCond %{REQUEST_URI} "^/$"
RewriteRule ^$ http://3rd-domain.com/ [R=permanent,L]
0 голосов
/ 18 апреля 2011

Ваши правила перенаправляют запрос с пустым QUERY_STRING.

. Для пустого request_uri вы можете использовать

RewriteCond %{HTTP_HOST} ^1st-domain\.com$
RewriteRule ^$ http://3rd-domain.com$1 [R=permanent,L]

RewriteCond %{HTTP_HOST} ^1st-domain\.com
RewriteRule ^(.*)$ http://2nd-domain.com$1 [R=permanent,L]

Первое правило сначала будет соответствовать <empty>, затем проверяется на <non-empty or empty> (который не может быть <empty> сейчас, так как мы уже обрабатывали его)

...