当另一个htaccess在子文件夹中时,URL重写不起作用

时间:2013-01-14 15:22:16

标签: php .htaccess

我的网站根目录中有.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规则?

2 个答案:

答案 0 :(得分: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但是在之后>放置在子范围内的任何规则。

答案 1 :(得分:0)

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

[L,R=301]

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

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

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

至少这是我的猜测。