php - 当另一个 htaccess 位于子文件夹中时,URL 重写不起作用

标签 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 规则?

最佳答案

当发出请求时,例如 /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/

相关文章:

php - 使用 PHP 和 CURL 创建新的 etherpad

php - .htaccess 创建用户友好的 url 并重定向到它

.htaccess - 未捕获的语法错误 : Unexpected token < in React JS

wordpress - Apache HTAccess 删除重定向的查询字符串

php - 使用 php 更新 mysql 中的信息

PHP/mysql 查询缺少行

php - 用于检查 MySQL 的 JavaScript 时间戳

php - 使用 Zend Db 运行未经准备的语句

javascript - htaccess 启动文件 javascript

eclipse - 使用 Eclipse 在 Glassfish 上从 Glassfish 切换到 Apache Tomcat Webserver 时缺少 Jar