Проблема обнаружения пустого URI запроса с перезаписью Apache mod

Я запускаю Apache с правилом перенаправления следующим образом:

RewriteCond %{HTTP_HOST} ^1st-domain.com
RewriteRule ^(.*)$ http://2nd-domain.com [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 [R=permanent,L]

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

мои правила упорядочены следующим образом:

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

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

какие предложения? Спасибо продвижение.

обновление

  1. пустой REQUEST_URI: http:/1st-domain.com
  2. непустой REQUEST_URI:http://1st-domain.com/something

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

ПОЛЕЗНЫЙ ЛАКОМЫЙ КУСОЧЕК Вы можете включить mod_rewrite debug с этим фрагмент:

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

очень полезная опция отладки я не знал.

8 ответов


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

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/ [R=permanent,L]

надеюсь, что это помогает!

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


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

RewriteEngine on

RewriteCond %{REQUEST_URI} "^/$"

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


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

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

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

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

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 [R=permanent,L]

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


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

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

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


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

# Check of the request uri is just 1 char long (checking for a slash was harder):
RewriteCond %{REQUEST_URI} ^.$

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

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]

вычеркнуть кавычки из пустой проверки