Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 如何为多级目录重写目录_.htaccess - Fatal编程技术网

.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扩展可以工作,但是