我的网站根目录中有一个 .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 规则?
最佳答案
当发出请求时,例如 /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
,但这些选项被放置在子范围中的任何规则之后。
关于php - 当另一个 htaccess 位于子文件夹中时,URL 重写不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321269/