使用特定查询字符串将URL的一部分重写到不同的域

时间:2012-02-06 14:53:24

标签: wordpress .htaccess url-rewriting query-string rewrite

我想只在设置了特定的查询字符串时才将一组url重写到另一个域。只需要重写主域url,url路径的其余部分需要保持不变,并且还需要删除查询字符串。

示例:

http://www.domain-a.com/post-type-a/post-title/?template=custom

应该重定向到:

http://www.domain-b.com/post-type-a/post-title/

http://www.domain-a.com/post-type-b/post-title/?template=custom

应该重定向到:

http://www.domain-b.com/post-type-b/post-title/

http://www.domain-a.com/post-type-c/post-title/?template=custom

应该重定向到:

http://www.domain-b.com/post-type-c/post-title/

查询字符串设置为加载不同的单帖模板,这样我就可以在我的express wordpress网站中创建一个微网站。但是我想在这个微型网站上使用我的其他域名,因此我的问题。

更新

如果我将这些行放在domain-b的根目录中的.htaccess中:

RewriteCond %{HTTP_HOST} domain-a\.com$ [NC]
Rewritecond %{QUERY_STRING} ^template=custom$ [NC]
RewriteRule ^ http://www.domain-b.com%{REQUEST_URI}? [R=301,L]

重定向确实有效,但我遇到了两个问题:

1)未加载正确的模板,因为在函数检测到之前,重写规则已经从查询字符串中取出。
2)由于其他重写规则,http://www.domain-b.com会更改回www.domain-a.com。

所以我认为我必须在我的wordpress函数中找到问题1的解决方案,而不是.htaccess。让我更好地解释一下我的情况:

我的主域名网站空间已在 domain-b 上注册。我的wordpress网站安装在博客文件夹中。我使用 domain-a 作为wordpress网址,因此 domain-b.com/blog / 会重定向到 domain-a 。 这工作正常,但如果查询字符串设置为 template = custom ,如上所述,我想对这些wordpress重写规则进行例外处理。在我的.htaccess文件中博客文件夹的根目录中,我有以下规则(由wordpress生成):

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>

这是我用来加载不同的单帖模板文件的函数:

// Add Query var
add_filter('query_vars', 'template_query_vars');
function template_query_vars( $query_vars ){
    $query_vars[] = 'template';
    return $query_vars;
}

// Switch template according to query parameter
add_filter( 'template_redirect', 'sjc_template' );
function sjc_template(){
    global $wp_query;
    if( $wp_query->get( 'template' ) ):
        global $post;
        $posttype = get_post_type($post->ID);
        include( get_template_directory() . '/single-'. $posttype .'-custom.php' );
        exit();
    endif;
}

所以我尝试将重写规则放在那里,但那还不行(还):

// Set up the rewrite
add_action( 'init', 'template_setup_rewrites' );
function template_setup_rewrites() {
    add_rewrite_rule('^/custom/?', '^/?template=custom', 'top');
    flush_rewrite_rules(false);
}

对于问题2,我不得不对Wordpress生成的重写规则进行异常处理以保持域名...

对不起,如果它有点模糊,但解释起来很复杂。 感谢任何帮助!

由于

1 个答案:

答案 0 :(得分:1)

将以下内容添加到站点根目录中的.htaccess文件中。

RewriteEngine on
RewriteBase / 

#if on www.domain-a.com
RewriteCond %{HTTP_HOST} ^www\.domain-a\.com$ [NC]
#and qs contains template=custom
RewriteCond %{QUERY_STRING} ^template=custom$ [NC]
#redirect any request to domain-b
RewriteRule ^ http://www.domain-b.com%{REQUEST_URI}? [R=301,L]

唯一的主要更改是更改了^$,这只会将主页与^匹配,这将匹配任何请求

修改以回应评论

Options +FollowSymlinks 
RewriteEngine On 

#if the blog is only supposed to operate on domain-a, restrict it with thie condition
RewriteCond %{HTTP_HOST} ^www\.domain-a\.com$ [NC] 
RewriteCond %{REQUEST_URI} !^/blog/.*$ 
RewriteRule ^(.*)$ /blog/$1 [L]

RewriteCond %{HTTP_HOST} ^www\.domain-a\.com$ [NC] 
RewriteCond %{QUERY_STRING} ^template=custom$ [NC] 
RewriteRule ^ http://www.domain-b.com%{REQUEST_URI}? [R=301,L]