Apache重定向指南

2020年12月31日19:35:21 发表评论 47 次浏览

了解如何在CentOS 7和Ubuntu 14.04上理解和配置Apache重定向。 Apache重定向在许多情况下都非常有用, 包括将访问者从站点的HTTP重定向到HTTPS版本, 将流量从WWW重定向到非WURL以及更改网页或目录名称。

要求

  • 运行CentOS 7或Ubuntu 14.04的Linux服务器
  • Apache已安装并正在运行

301永久对比302临时重定向

301永久重定向与302临时重定向之间的主要区别与网站的SEO有关。从SEO角度来看, 更希望使用301永久重定向。

搜索引擎爬网程序将302重定向视为临时重定向

当搜索引擎搜寻器点击302重定向时, 它会记下新地址并继续前进。根据爬虫的不同, 它可能会在将来某个时候标记要重新访问的URL。

搜寻器执行此操作是因为302重定向旨在指示该重定向只是临时的, 并且"真实" URL将很快恢复在线状态。

301重定向可保留你的SEO排名

相比之下, 当搜索引擎抓取工具遇到301重定向时, 抓取工具将其理解为永久重定向。因此, 它不仅记录了新URL, 而且还启动了将任何页面等级值从旧URL转移到新URL的过程。

对于SEO而言, 此转移过程至关重要。它使你可以更改网站的URL, 而不会丢失页面所获得的任何有价值的SEO"果汁"。

始终强制执行301重定向

因此, 无论何时创建重定向, 你总是要指定它是301重定向。在许多情况下, 如果未指定重定向类型, 则默认为302重定向。

基本301重定向

如果你只需要重定向一个(或少量)URL, 那么将这些URL分别添加到站点的Apache配置文件中就很容易。

基本网址重定向

301重定向使用重新导向Apache配置文件中的指令, 其语法为:

Redirect 301 [old URL] [new URL]

例如, 假设example.com已决定将其站点的博客从子目录移至该目录(http://example.com/blog)到自己的规范域(http://blog.example.com)。 Redirect指令将显示为:

Redirect 301 /blog http://blog.example.com

新的URL也可以是外部URL, 例如本示例, 该重定向将从http://example.com/store到亚马逊商店页面:

Redirect 301 /store https://www.amazon.com/s?marketplaceID=AT32311PKK0DER&me=ASEVS99O66653FS73&merchant=ASEV33F6FS73&redirect=true

这使网站的所有者可以说"访问example.com/store购买我的亚马逊商店", 而不必传递冗长而复杂的URL。

的重新导向指令需要进入虚拟主机该站点的主Apache配置文件中的命令块。

按照惯例, 此Apache配置文件通常为:

  • CentOS的7/etc/httpd/conf.d/example.com.conf
  • Ubuntu 14.04/etc/apache2/sites-available/example.com.conf

注意:站点的Apache配置文件的位置和文件名可能会根据你或你的服务器管理员设置主机的方式而有所不同。

使用你选择的编辑器编辑此文件, 例如, 使用以下命令:

  • CentOS的7须藤nano /etc/httpd/conf.d/example.com.conf
  • Ubuntu 14.04须藤纳米/etc/apache2/sites-available/example.com.conf

滚动浏览文件, 直到找到虚拟主机命令块, 如下所示:

<VirtualHost *:80>
ServerName example.com
    <Directory "/var/www/example.com/html">
    AllowOverride All
    </Directory>
</VirtualHost>

添加重新导向到虚拟主机命令块, 但请务必将其放在任何外部目录命令块。例如:

<VirtualHost *:80>
ServerName example.com
Redirect 301 /blog http://blog.example.com
    <Directory "/var/www/example.com/html">
    AllowOverride All
    </Directory>
</VirtualHost>

保存并退出文件, 然后重新启动Apache以使更改生效:

  • CentOS的7sudo systemctl重新启动httpd
  • Ubuntu 14.04sudo服务apache2重新启动

将WWW重定向到非WWW网站URL

通常的做法是, 使用URL将URL的WWW版本别名为非WWW版本(反之亦然)。服务器别名该站点的Apache配置文件中的一行。尽管这对于网站访问者来说足够好用, 但是从SEO的角度来看, 它并不是"最佳实践"。

使用服务器别名而不是301重定向会导致该网站被标记为"重复内容"的风险。一些搜索引擎爬虫没有意识到www.example.com和http://example.com是相同的网址。

网址的WWW版本和非WWW版本在SEO方面没有区别。重要的是你选择一个并持续使用它。

注意:以下指示会将流量从WWW重定向到URL的非WWW版本。如果你希望相反(将流量从非WWW版本重定向到WWW版本), 只需根据需要编辑命令。

这个重新导向指令需要放入一个新的虚拟主机该站点的主Apache配置文件中的命令块。

按照惯例, 此Apache配置文件通常为:

  • CentOS的7/etc/httpd/conf.d/example.com.conf
  • Ubuntu 14.04/etc/apache2/sites-available/example.com.conf

注意:站点的Apache配置文件的位置和文件名可能会根据你或你的服务器管理员设置主机的方式而有所不同。

使用你选择的编辑器编辑此文件, 例如, 使用以下命令:

  • CentOS的7须藤nano /etc/httpd/conf.d/example.com.conf
  • Ubuntu 14.04须藤纳米/etc/apache2/sites-available/example.com.conf

滚动浏览主画面虚拟主机命令块, 可能看起来像这样:

<VirtualHost *:80>
ServerName example.com
    <Directory "/var/www/example.com/html">
    AllowOverride All
    </Directory>
</VirtualHost>

如果你在此命令块中看到一行, 内容为:

ServerAlias www.example.com

删除此行。

滚动到文件底部并添加一个新的虚拟主机底部的命令块:

<VirtualHost *:80>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

保存并退出文件, 然后重新启动Apache以使更改生效:

  • CentOS的7sudo systemctl重新启动httpd
  • Ubuntu 14.04sudo服务apache2重新启动

设置mod_rewrite并允许.htaccess文件

对于更复杂的301重定向, Apache模块mod_rewrite是最佳选择。该模块快速, 灵活且功能强大。

在CentOS 7上启用mod_rewrite

默认情况下, mod_rewrite在CentOS 7上处于启用状态。如果发现它尚未启用, 则可以通过使用以下命令编辑基本模块配置文件来启用它:

sudo nano /etc/httpd/conf.modules.d/00-base.conf

添加以下行, 如果已将其注释掉, 则取消注释:

LoadModule rewrite_module modules/mod_rewrite.so

接下来, 启用.htaccess文件。为此, 请编辑站点的主要Apache配置文件。

按照惯例, 此Apache配置文件通常是/etc/httpd/conf.d/example.com.conf在CentOS 7上。

注意:站点的Apache配置文件的位置和文件名可能会根据你或你的服务器管理员设置主机的方式而有所不同。

使用你选择的编辑器编辑此文件, 例如, 使用以下命令:

sudo nano /etc/httpd/conf.d/example.com.conf

滚动浏览主画面虚拟主机命令块, 可能看起来像这样:

<VirtualHost *:80>
ServerName example.com
    <Directory "/var/www/example.com/html">
    AllowOverride None
    </Directory>
</VirtualHost>

在里面目录阻止, 改变AllowOverride从默认Noneto所有:

AllowOverride All

如果没有目录封锁虚拟主机命令块, 添加以下内容:

<Directory "/var/www/example.com/html">
         AllowOverride All
     </Directory>

确保使用正确的网站文档根目录路径。

保存并退出文件。重新启动Apache, 以使更改生效:

sudo systemctl restart httpd

在Ubuntu 14.04上启用mod_rewrite

要启用mod_rewrite, 请使用以下命令:

sudo a2enmod rewrite

如果尚未启用该模块, 则将启用该模块。重新启动Apache以使更改生效:

sudo service apache2 restart

接下来, 允许使用.htaccess文件。为此, 请编辑站点的主要Apache配置文件。

按照惯例, 此Apache配置文件通常是/etc/apache2/sites-available/example.com.conf在Ubuntu 14.04上。

注意:站点的Apache配置文件的位置和文件名可能会根据你或你的服务器管理员设置主机的方式而有所不同。

使用你选择的编辑器编辑此文件, 例如, 使用以下命令:

sudo nano /etc/apache2/sites-available/example.com.conf

滚动浏览主画面虚拟主机命令块, 直到找到目录命令块, 可能看起来像这样:

<Directory /var/www/example.com/html/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

更改AllowOverride从默认Noneto所有:

AllowOverride All

如果没有目录封锁虚拟主机命令块, 添加以下内容:

<Directory /var/www/example.com/html/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

确保使用正确的网站文档根目录路径。

保存并退出文件。重新启动Apache, 以使更改生效:

sudo service apache2 restart

创建一个.htaccess文件

现在, 你已经将站点配置为使用mod_rewrite并允许.htaccess文件, 是时候该移动到网站的文档根目录(主Web目录)并创建.htaccess文件了。

该文件名必须完全按照所示创建, 并在名称的开头加上句点。对.htaccess文件进行更改后, 无需重启Apache。

首先, 切换到站点的文档根目录, 例如:

cd /var/www/example.com/html

接下来, 创建.htaccess使用以下命令在此处归档:

sudo nano .htaccess

将在此文件中设置所有mod_rewrite配置。让我们从一个简单的测试开始, 以确保一切正常。

将以下行添加到此文件:

RewriteEngine on
RewriteRule ^hello.html$ goodbye.html

此规则将重定向请求hello.html到页面goodbye.html.

保存并退出文件。

接下来, 使用命令创建两个文件:

sudo echo "Hello" >> hello.html
sudo echo "Goodbye" >> goodbye.html

现在访问hello.html浏览器中的文件。你应该重定向到goodbye.html上面写着"再见"。

将多个域指向同一网站

有多个原因可能导致你需要将多个URL指向同一个网站。

  • 如果你的主要网站是example.com, 则可能还需要购买example.net和example.org以便捕获名称空间。
  • 最好锁定域名的常见拼写错误, 例如exampl.com或exmple.com。
  • 你可能还希望拥有域名的变体, 例如the-example.com或my-example.com。

尽管你可以简单地将这些域名指向你的主要网站, 但是设置301重定向来完成这项工作是明智的。这是Google的建议除其他外

要设置301重定向以将多个域名指向同一个网站, 请先设置mod_rewrite和.htaccess文件, 然后将以下几行添加到该网站的.htaccess文件中:

RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301]

这会将流量从example.nettoexample.com.

这些规则将需要自定义以适合你的域名和所需的结果。例如, 将流量重定向到网址的WWW版本(www.example.com), 而是使用:

RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301]

将访问者重定向到你网站的SSL安全版本

如果要确保通过SSL保护站点上所有流量的安全, 则需要将所有对http://example.com URL的请求重定向到https://example.com。

要设置301重定向以将访问者发送到网站的HTTPS版本, 请首先设置mod_rewrite和.htaccess文件, 然后将以下几行添加到网站的.htaccess文件中:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://example.com$1 [R=301, L]

如果你希望将流量重定向到域名的WWW版本, 请改用以下规则:

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

重命名网页和移动目录

在某些情况下, 你必须重命名现有的网页或目录。这将破坏指向该页面的所有链接, 这不仅会破坏访问者的体验, 还会影响你的SEO。

设置mod_rewrite和.htaccess文件后, 请在网站的.htaccess文件中使用以下规则。

重命名网页

RewriteEngine on
RewriteRule ^old-page.html$ /new-page.html [R=301]

重命名目录

RewriteEngine on
RewriteRule ^old-directory/ /new-directory/ [R=301]

在上述示例中, 文件和目录的名称作为相对于网站文档根目录的路径给出。路径有三个选项:

  • 完整的文件系统路径(/var/www/html/new-page.html)
  • 相对于文档根目录(/new-page.html)
  • 绝对网址(http://example.com/new-page.html)

关于mod_rewrite的更多详细信息

mod_rewrite使用正则表达式来匹配和替换URL。要启用mod_rewrite, 请在规则的第一行.htaccess文件必须始终为:

RewriteEngine on

mod_rewrite的核心是RewriteRules, 通常与RewriteCond结合使用。

重写规则

RewriteRule具有三个部分:

RewriteRule [pattern] [substitution] [flags]

的模式使用正则表达式构建。如果你熟悉正则表达式, 这个mod_rewrite备忘单是一个有用的工具.

的替代可:

  • 完整的文件系统路径(/var/www/html/blog/index.php)
  • 相对于文档根目录(/博客)
  • 绝对网址(http://example.com/blog/index.php)

的旗是可选的。一些最常见的包括:

  • 大号:表明这是一系列规则中的最后一条。
  • R = 301:强制301重定向。
  • NC:忽略大小写, 因此规则不区分大小写。

可用标志的完整列表可以是在Apache官方网站上找到.

有时, RewriteRule由RewriteCond开头。这指定使用RewriteRule的条件。

RewriteCond

RewriteCond也包含三个部分:

RewriteCond [test string] [condition] [flags]

的测试字符串通常是服务器变量, 其格式为%{变量名称}.

的健康)状况可以是三件事之一:

  • 正则表达式
  • 字符串比较
  • 文件/路径测试

的旗是可选的。三个标志可用于RewriteCond:

  • NC:忽略大小写, 以便条件不区分大小写。
  • OR:逻辑"或"。
  • NV:" No Vary", 标头名称不会添加到Vary响应标头中。

RewriteRule与Redirect

许多人想知道RewriteRule和Redirect之间的区别是什么。两者都可以用于.htaccess文件以重定向网站流量。

主要区别在于RewriteRule由mod_rewrite处理, 而Redirect由mod_alias处理。

mod_rewrite

  • 用途重写规则和RewriteCond.
  • 功能强大得多, 因为它使用正则表达式来匹配和替换URL。
  • 可能更难使用。
  • 默认情况下可能未安装或启用。

mod_alias

  • 用途重新导向和重定向匹配.
  • 不可配置。
  • 可以更容易使用。
  • 默认情况下, 在大多数Apache安装中已启用该功能。

无论你使用mod_rewrite还是mod_alias规则, 你都将始终要指定301永久重定向。

一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: