这是我的.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这是我的项目结构:

我的想法是,我所有的超文本标记语言文件都是在views文件夹中结构化的,但是我不希望我的URL是http://example.com/views/index,而只是http://example.com/index,没有views-part。
这在以下情况下工作正常:http://example.com/account/
但一旦我尝试访问帐户文件夹中的文件时就会失败,例如:http://example.com/account/voeg-kind-toe
结果是404。这个.htaccess解决方案似乎只适用于一级目录。
Edit:有趣:如果我把最下面的两行放在最上面(所以把重写view-part的代码放在删除php-extension的代码之前);php-extension可以用,但/views//部分不行。
发布于 2020-06-29 13:04:20
像这样创建.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]发布于 2020-06-30 01:04:10
正如我在上面的评论中提到的,如果没有其他指令/冲突,那么这仍然应该以一种间接的方式“工作”。但是,以下指令在您放置它的顺序中存在问题:
检查请求是否为PHP文件: RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^/?(.*)$ /$1.php
您没有测试/views子目录中的文件。但是,REQUEST_FILENAME并不一定包含(我认为)您认为它包含的内容。当您请求/account/voeg-kind-toe (一个完全虚拟的URL路径)时,REQUEST_FILENAME包含/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是输入。
在第二次遍历中,REQUEST_FILENAME为/views/account/voeg-kind-toe (因为/views/account是一个物理目录),并且请求被重写到/views/account/voeg-kind-toe.php (因为文件系统检查应该是成功的)。如果您没有其他指令,那么处理现在应该停止。
在以下情况下,
可以正常工作:
http://example.com/account/
最后一条规则将/account/简单地重写为/views/account/。
视图编辑:有趣的是:如果我把最下面的两行放在顶部(所以把重写
-part的代码放在删除php-的代码之前);php-extension可以工作,但/views//部分不行。
与上面的过程相同,只是这一切都发生在一次传递中,因此对文件中稍后可能出现的其他指令的依赖性较小。
我不确定你说的“/views//part not”是什么意思?
假设您在/views目录中只有.php文件,并且所有URL都指向/views子目录,并且您不需要直接引用目录,那么您可以这样做,这是一个单独的指令,并重写不包含(看起来像是) /views/<whatever>.php文件扩展名的所有内容。
例如:
RewriteRule !\.\w{2,4}$ /views%{REQUEST_URI}.php [L]如果后面有其他mod_rewrite指令,则需要L (last)标志,以防止额外的处理。
这确实意味着您不能依赖目录索引。即。您需要请求/index (如您的示例所示),而不仅仅是请求/来为/views/index.php提供服务。
(您仍然需要从请求的URL中删除.php的第一个规则-尽管这只在更改现有的URL结构时才是绝对必要的,因为您以前在URL上使用了.php。)
https://stackoverflow.com/questions/62631458
复制相似问题