htaccess:将旧域和所有页面重定向到新域

时间:2011-06-29 08:25:03

标签: regex apache .htaccess mod-rewrite expressionengine

我知道Stackoverflow上有很多例子,但我仍然遗漏了一些东西。

我正在尝试使用以下规则将http://old.domain.com/fr/重定向到http://brand.new-domain.com/fr/,但这不起作用:

# Enable Rewrite Engine
RewriteEngine On
RewriteBase /

# Add a trailing slash to paths without an extension
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ $1/ [L,R=301]

# Redirect domain
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^old.domain.com [OR]
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC]
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [r=301,L]

# Remove index.php
# Uses the "exclude method"
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Exclude_List_Method
# This method seems to work best for us, you might also use the include method.
# http://expressionengine.com/wiki/Remove_index.php_From_URLs/#Include_List_Method
# Exclude root files
RewriteCond $1 !^(index\.php) [NC]
# Exclude EE folders
RewriteCond $1 !^(assets|ee-admin|images|templates|themes|fr|nl)/ [NC]
# Exclude user created folders
RewriteCond $1 !^(assets|css|img|js|swf|uploads)/ [NC]
# Exlude favico, robots, ipad icon
RewriteCond $1 !^(favicon\.ico|robots\.txt|pple-touch-icon\.png) [NC]
# Remove index.php
RewriteCond %{QUERY_STRING} !^(ACT=.*)$ [NC]
RewriteCond %{QUERY_STRING} !^(URL=.*)$ [NC]
RewriteRule ^(.*)$ /index.php?/$1 [L]

当我调用根URL时它正确地重定向,但在我调用页面时却没有。我做错了什么?

提前致谢!

Pv的

3 个答案:

答案 0 :(得分:9)

编写mod_rewrite规则时,规则会按照它们出现的顺序应用。

要将旧域重定向到新域,您需要在.htaccesshttpd.conf文件中首先该规则 - 所有其他规则应在它

如果您只想重定向某个目录,则以下规则会这样做,同时允许网站的其余部分正常运行:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect Only Matching Directories
    RewriteCond %{REQUEST_URI} ^/(fr|fr/.*)$
    RewriteRule ^(.*)$ http://brand.new-domain.com/fr/$1 [R=301,L]
</IfModule>

如果要重定向整个网站,以下规则将执行此操作:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirect Entire Site to New Domain
    RewriteCond %{HTTP_HOST} ^old.domain.com$ [OR]
    RewriteCond %{HTTP_HOST} ^other-old.domain.com$ [NC]
    RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L]
</IfModule>

如果您关心让抓取工具知道您的内容已移动并希望尽可能无缝地进行转换,请确保将301 Redirect标记保留在RewriteRule中。

这将确保用户和搜索引擎定向到正确的页面。


虽然我们正在谈论这个问题,但作为EE 2.2版本的一部分,EllisLab现在“正式”为removing index.php from ExpressionEngine URLs提供有限的技术支持。

只需将您的代码添加或更新为以下内容,请务必考虑您已有的任何规则:

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Removes index.php
    RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php/$1 [L]

    # If 404s, "No Input File" or every URL returns the same thing
    # make it /index.php?/$1 above (add the question mark)
</IfModule>

答案 1 :(得分:3)

尝试使用以下ruke作为第一个:

# Redirect domain
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^old.domain.com [OR]
RewriteCond %{HTTP_HOST} ^other-old.domain.com [NC]
RewriteRule ^(.*)$ http://brand.new-domain.com/$1 [R=301,L]

还要注意大写R with是小写redirect的缩写形式。

答案 2 :(得分:1)

在尝试hacky-mod-rewrite之前,您是否尝试过使用mod_alias简单重定向指令(您拥有的核心模块)?

我会使用ServerName old.domain.com进行VirtualHost,在此VH中我会添加此规则:

Redirect /fr http://brand.new-domain.com/fr

来自doc:

  

然后,以URL-Path开头的任何请求都会向目标URL位置的客户端返回重定向请求。匹配的URL-Path之外的其他路径信息将附加到目标URL。

因此,请为brand.new-domain.com(使用ServerName brand.new-domain.com)获取单独的VirtualHost,并在此处不设置重定向规则。

如果您仍想在同一个VirtualHost中处理2个域,则必须使用mod-rewrite,因为即使RedirectMatch也无法检查查询中的请求域。