重写规则以将所有子页面重定向到单个页面?

重写规则以将所有子页面重定向到单个页面?

我有两个/etc/apache2/sites-available/foo文件/etc/apache2/sites-available/foo_maintenance

我使用的重写规则/etc/apache2/sites-available/foo

<Directory /var/www/public_html>
        Options +FollowSymlinks
        RewriteOptions inherit
        RewriteEngine on
        #
        RewriteCond %{HTTP_HOST} ^mysite\.com [NC]
        RewriteRule ^(.*)$ http://www.mysite.com/$1 [R=301,L]
</Directory>

以便全部mysite.com/*重定向到www.mysite.com

在我关闭我的网站进行维护后,如果用户导航到网站的子页面(如 mysite.com/subdir/something.php),我希望将他们重定向到 www.mysite.com,以便显示维护页面的 index.html。

将所有流量从任何子页面重定向到的重写规则是什么www.mysite.com

答案1

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

RewriteRules 有三个部分。要匹配的模式、替换和标志。本例中的模式是^(.*)$^表示行首,$表示行尾。.表示任意字符,*后面的表示可以出现任意次。现在,圆括号定义了一个捕获组,它基本上存储了括号之间出现的所有内容。然后您可以在替换中使用这些捕获组。因此,如果请求是/subdir/something.php,则第一个捕获组将包含“/subdir/something.php”。

本例中的替换为http://www.mysite.com/$1, 表示$1匹配模式中的第一个捕获组。目标 URL 由填写这些捕获组组成,在本例中将产生http://www.mysite.com/subdir/something.php

因此,如果您想始终将用户发送到根目录,www.mysite.com而不管他们请求的路径是什么,您只需不在替换中填写路径,即删除该$1部分。您的最终规则将如下所示:

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

答案2

您可以采取类似这样的做法:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^mysite\.com [NC]
RewriteCond %{REQUEST_URI} !^/$ [NC]
RewriteRule ^.*$ http://www.mysite.com/ [L]
  • 第 1 行在此上下文中启用重写引擎。
  • 第 2 行检查请求是否发送到我的站点
  • 第 3 行检查请求的 URI 是否尚未/
  • 第 4 行将所有地址重定向至http://www.mysite.com/

相关内容