.htaccess 如何为多级目录重写目录
这是我的.htaccess 如何为多级目录重写目录,.htaccess,.htaccess,这是我的.htaccess RewriteEngine On # browser requests PHP RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php RewriteRule ^/?(.*)\.php$ /$1 [L,R=301] # check to see if the request is for a PHP file: RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRul
.htaccess
RewriteEngine On
# browser requests PHP
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
RewriteRule ^/?(.*)\.php$ /$1 [L,R=301]
# check to see if the request is for a PHP file:
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)$ /$1.php
RewriteCond %{REQUEST_URI} !^/(views|css|js|media|partials|php)
RewriteRule (.*) /views/$1
这是我的项目结构:
我的想法是,我的所有HTML文件都在文件夹views
中结构化,但我不希望我的URL没有视图部分
在以下情况下,这可以正常工作:
但当我尝试访问accounts文件夹中的文件时失败,例如:
结果是404。似乎此.htaccess
解决方案仅适用于一级目录
编辑:
有趣的是:如果我将底部的两行放在顶部(因此将重写视图部分的代码放在删除php扩展的代码之前);php扩展可以工作,但是/views//部分不能工作。Create.htaccess如下
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/views/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /views/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ views/ [L]
像这样创建.htaccess
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/views/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /views/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ views/ [L]
正如我在上面的评论中提到的,如果没有其他指令/冲突,那么这仍然应该以迂回的方式“起作用”。但是,以下指令的顺序存在问题: 您没有测试
/views
子目录中的文件。但是,REQUEST\u FILENAME
也不一定包含(我认为)您所认为的内容。当您请求/account/voeg kind toe
(一个完全虚拟的URL路径)时,则请求文件名
包含/account
(它实际上包含一个绝对的文件系统路径,但我一直保持简短)。因此,上面测试的是/account.php
是否存在,而不是/account/voeg-kind-toe.php
,甚至是/views/account/voeg-kind-toe.php
——这大概是目的所在
因此,在第一个过程中,上述条件失败,没有重写发生,处理继续
然后,第二条规则将/account/voeg-kind-toe
请求重写为/views/account/voeg-kind-toe
。如果没有进一步的mod_rewrite指令,则重写引擎将重新启动。这一次,/views/account/voeg-kind-toe
是输入
在第二次传递时,请求的文件名是/views/account/voeg kind toe
(因为/views/account
是一个物理目录),请求被重写为/views/account/voeg kind toe.php
(因为文件系统检查应该成功)。如果您没有其他指令,那么处理现在应该停止
在以下情况下,这可以正常工作:http://example.com/account/
根据最后一条规则,/account/
只需重写为/views/account/
编辑:有趣:如果我把下面的两行放在上面(所以把重写视图部分的代码放在删除php扩展的代码之前);php扩展可以工作,但/views//部分不能
发生与上述相同的过程,但这一切都发生在一个过程中,因此不太依赖于文件中稍后可能出现的其他指令
我不知道你所说的“视图//部分不”是什么意思
假设您在/views
目录中只有.php
文件,并且所有URL都指向/views
子目录,并且您不需要直接引用目录,那么您可以只执行一个指令,重写不包含的所有内容(看起来像什么)/views/.php
的文件扩展名
例如:
RewriteRule !\.\w{2,4}$ /views%{REQUEST_URI}.php [L]
如果后面有其他mod_rewrite指令,则需要使用L
(last
)标志,以防止额外处理
这意味着您不能依赖目录索引。例如,您需要请求/index
(如您的示例所示),而不仅仅是/
来提供/views/index.php
(您仍然需要从请求的URL中删除.php
的第一条规则-尽管这仅在您更改现有URL结构时严格必要,您以前在URL上使用了.php
。如我在上面的评论中所述,如果没有其他指令/冲突,则仍应以迂回的方式“工作”。但是,以下指令的顺序存在问题:
您没有测试/views
子目录中的文件。但是,REQUEST\u FILENAME
也不一定包含(我认为)您所认为的内容。当您请求/account/voeg kind toe
(一个完全虚拟的URL路径)时,则请求文件名
包含/account
(它实际上包含一个绝对的文件系统路径,但我一直保持简短)。因此,上面测试的是/account.php
是否存在,而不是/account/voeg-kind-toe.php
,甚至是/views/account/voeg-kind-toe.php
——这大概是目的所在
因此,在第一个过程中,上述条件失败,没有重写发生,处理继续
然后,第二条规则将/account/voeg-kind-toe
请求重写为/views/account/voeg-kind-toe
。如果没有进一步的mod_rewrite指令,则重写引擎将重新启动。这一次,/views/account/voeg-kind-toe
是输入
在第二次传递时,请求的文件名是/views/account/voeg kind toe
(因为/views/account
是一个物理目录),请求被重写为/views/account/voeg kind toe.php
(因为文件系统检查应该成功)。如果您没有其他指令,那么处理现在应该停止
在以下情况下,这可以正常工作:http://example.com/account/
根据最后一条规则,/account/
只需重写为/views/account/
编辑:有趣:如果我把下面的两行放在上面(所以把重写视图部分的代码放在删除php扩展的代码之前);php扩展可以工作,但是