2

我的站点根目录中有一个 .htaccess 文件。在文件中,我有一个代码可以重定向所有流量以添加“www”。到网址的开头:

Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^website.com [NC] 
RewriteRule ^(.*)$ http://www.website.com/$1 [L,R=301]

这适用于 95% 的网站。但是,我有一个子目录 website.com/playdate,在该文件夹中有另一个 .htaccess 文件。在这个 .htaccess 文件中是以下代码,用于将 URL 重定向到更简洁的内容:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^page/([0-9]+)/ index.php?page=$1

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z0-9_-]+)/ view.php?url_slug=$1

这段代码似乎覆盖了 www 重定向。我试图添加初始代码,

Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^website.com [NC] 
RewriteRule ^(.*)$ http://www.website.com/$1 [L,R=301]

到辅助 .htaccess 的顶部,但这不起作用。

如何让子目录继续转发到“www”。网站的版本,同时还保留此子文件夹的辅助 .htaccess 规则?

4

2 回答 2

2

例如/playdate,当发出请求时,首先发生的是 URL 到文件的映射,然后 apache 检查该文件映射(在本例中映射到目录)是否包含 htaccess 文件。如果不是,那么它会检查父目录中的 htaccess 文件。如果,那么它只是使用该目录中的 htaccess 文件。

因此,当对 发出请求时/playdate,它在该目录中有一个 htaccess 文件,因此 apache 不会费心在任何父目录中查找。只有这一个 htaccess 文件被应用,位于父目录中的任何文件都将被忽略。

如果您使用的是 apache 2.2,那么您只需复制www重定向规则,但您需要调整它们,因为您不再位于文档根目录中。将这些规则添加到您的 htaccess 文件的顶部(或至少在您已经拥有的任何规则之上):

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^website.com [NC] 
RewriteRule ^(.*)$ http://www.website.com/playdate/$1 [L,R=301]

如果您使用的是 apache 2.4,则可以将特定选项应用于 playdate 目录中的 htaccess 文件:

RewriteOptions InheritBefore

这使得父作用域中的任何规则都在子作用域中的任何规则之前被继承。这很重要,因为您需要确保在应用任何路由规则之前出现www重定向规则,否则 URI 会被破坏。Apache 2.2 有一个类似的选项,但是这些选项放在子范围内的任何规则之后。Inherit

于 2013-01-14T16:15:49.450 回答
0

我认为您的问题是您在重写完整域名时使用的 L 标志。

[L,R=301]

L 标志表示“最后一个”,如“这是我希望服务器为此 URI 请求处理的最后一个重写指令”。如果用户代理请求“ http://website.com/playdate ”,那么重写条件将触发该行

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

服务器会将请求重写为http://www.website.com/playdate停止处理该 URI 请求的重写规则,因为服务器到达 L 标志。

至少这是我的猜测。

于 2013-12-03T22:04:35.303 回答