我在root中有一个子目录(我们称之为/sub
)和.htaccess
。如果我调用以下URL:mywebsite.com/sub
,我会直接进入子目录,省略root中的.htaccess
,所以我想问一下是否可以强制服务器先读取root .htaccess
到子目录(并在需要时进行相应的重定向)?
提前致谢
编辑:我发现我的重定向明确排除了不需要的目录(似乎是我问题的根源):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]
我删除了第二行,但不幸的是我仍然进入我的文件夹。
所以说清楚:
http://mywebsite.com/not-a-folder-in-root
时,我被正确地重定向到新网站http://mywebsite.com/a-folder-in-root
时,我没有被重定向,而是转到我的子文件夹index.php
后者是我想要消除的行为。
答案 0 :(得分:1)
这取决于你需要做什么。首先.htaccess文件按找到它们的顺序读取。
应用.htaccess文件中的配置指令 找到.htaccess文件的目录,以及所有目录 子目录。但是,重要的是要记住这一点 目录中可能存在.htaccess文件。 指令按照找到的顺序应用。因此,一个 特定目录中的.htaccess文件可能会覆盖找到的指令 在.htaccess文件中找到更高的目录树。以及那些, 反过来,可能已经被覆盖的指令发现更高,或者在 主服务器配置文件本身。
因此htaccess文件将始终覆盖根目录中的文件。但是,您可以操作Apache配置文件并在Location
指令中指定指令。您可以指定某些规则,然后它将影响.htaccess规则。请参阅以下信息。
正如配置章节文档中所述,.htaccess 文件可以覆盖相应的部分 目录,但将被其他类型的配置覆盖 主配置文件中的部分。这个事实可以用来 即使在自由主义者面前,也要强制执行某些配置 AllowOverride设置。例如,防止脚本执行 允许在.htaccess中设置任何其他内容,您可以使用:
<Directory "/www/htdocs">
AllowOverride All
</Directory>
<Location "/">
Options +IncludesNoExec -ExecCGI
</Location>
否则,如果由于您无权访问而无法进行更改,则必须执行root
.htaccess文件中与子文件夹相关的所有规则。你可以做而不是将.htaccess放在sub
文件夹中。
根据评论进行修改
#just use this for all requests
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]
#Or you can do all non-existent folders and that sub folder too
RewriteCond %{REQUEST_URI} ^/sub [NC]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) http://redirectwebsite.com/$1 [R=301,L]