将单个页面从其他域重定向到主域会导致重定向过多

时间:2014-07-02 10:29:38

标签: php apache .htaccess mod-rewrite redirect

我只需要将另一个域中的/login页面重定向到我的主域名。

但是,我目前拥有的重定向过多。

我错过了什么?

htaccess的:

RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^otherdomain.com$ [NC]
# RewriteRule ^login https://www.domain.com/login [R=301,L]  GIVES TOO MANY REDIRECTS
RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^domain.com$
RewriteCond %{HTTPS} !=on
RewriteRule ^/? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [L,QSA]

2 个答案:

答案 0 :(得分:1)

好吧试试这个.htaccess:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?otherdomain\.com$ [NC]
RewriteRule ^login https://www.domain.com/login [R=301,L,NC]

RewriteCond %{HTTP_HOST} ^otherdomain\.com$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.domain\.com$ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [L,QSA]

并确保在新浏览器中进行测试,以避免浏览器的301缓存。

答案 1 :(得分:0)

我看到两个问题。

一个。

您的https重定向不会检查您是否已使用https。因此,在重定向到https://www.domain.com/login后,您的https规则就会启动。

通常情况下,您可以通过添加此条件(顶部的第一行)来更改第一条规则:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L]

但在我看来,您可以完全删除该规则,因为您已经使用此规则强制执行https:

RewriteCond %{HTTP_HOST} ^domain.com$
RewriteCond %{HTTPS} !=on
RewriteRule ^/? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

尝试:取消注释登录规则,并注释掉第一个https规则。

B中。第二个问题是otherdomain.com重定向到自己:

RewriteCond %{HTTP_HOST} ^otherdomain.com$ [NC]
# RewriteRule ^login https://www.domain.com/login [R=301,L]  GIVES TOO MANY REDIRECTS
RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]

一个条件仅适用于一个规则。现在,这导致其他域上的文件重定向到自己。

目前你需要注释掉这一行:

RewriteRule ^(.*)$ http://www.otherdomain.com/$1 [R=301,L]