首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为多级目录重写目录

如何为多级目录重写目录
EN

Stack Overflow用户
提问于 2020-06-29 12:55:53
回答 2查看 38关注 0票数 1

这是我的.htaccess

代码语言:javascript
复制
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//部分不行。

EN

回答 2

Stack Overflow用户

发布于 2020-06-29 13:04:20

像这样创建.htaccess

代码语言:javascript
复制
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]
票数 0
EN

Stack Overflow用户

发布于 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文件扩展名的所有内容。

例如:

代码语言:javascript
复制
RewriteRule !\.\w{2,4}$ /views%{REQUEST_URI}.php [L]

如果后面有其他mod_rewrite指令,则需要L (last)标志,以防止额外的处理。

这确实意味着您不能依赖目录索引。即。您需要请求/index (如您的示例所示),而不仅仅是请求/来为/views/index.php提供服务。

(您仍然需要从请求的URL中删除.php的第一个规则-尽管这只在更改现有的URL结构时才是绝对必要的,因为您以前在URL上使用了.php。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62631458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档