如何通过Htaccess检查和删除文件夹中是否存在子文件夹



我有这样的文件结构。

Folder
- .htaccess
- Subfolder
- Otherfolder
- file1.html
- file2.html
- filea.html
- fileb.html

我可以在"其他文件夹"的位置有很多文件夹,我不想为"子文件夹"的每个子文件夹添加代码。

我想删除除文件夹以外的所有其他子文件夹名称。

我只想获得类似-mywebsite.com/folder/file.html的URL

编辑

目前我正在.htaccess 中使用此代码片段

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^subfolder/([^.]+).html$ /folder/$1 [L,R]
RewriteCond %{REQUEST_URI} !/folder/subfolder/
RewriteCond %{REQUEST_URI} !.(css|js|jpg|gif|png|jpeg)$
RewriteRule ^(.+)/?$ /folder/subfolder/$1.html [L]

我可以在"otherfolder"的位置有很多文件夹,我不想为"subfolder"中的每个子文件夹添加代码。

这在单独的.htaccess中是不可能的。问题不在于从URL中删除子文件夹(尽管这应该已经在内部链接中完成(,而在于内部将请求重写回相应的子文件夹。没有内置的机制来";搜索";用于CCD_ 2中的任意文件。

如果已知子文件夹的数量有限,则可以执行此操作,但需要为每个子文件夹添加一个规则(在根.htaccess文件中(。但是,这并不是特别有效,因为您需要手动测试每个子文件夹中是否存在该文件。您还存在名称冲突的潜在问题。显然,如果你有效地;"压平";文件系统文件file1.html在所有子文件夹中只能在文件系统上存在一次。如果存在多个file1.html,则第一场比赛获胜。

原则上,您需要执行以下操作来将/folder/<file>.html的请求重写回/folder/subfolder/otherfolderN/<file>.html

# Test "subfolder/otherfolder1"
RewriteCond %{DOCUMENT_ROOT}/folder/subfolder/otherfolder1/$0 -f
RewriteRule ^[^/.].html$ subfolder/otherfolder1/$0 [L]
# Test "subfolder/otherfolder2"
RewriteCond %{DOCUMENT_ROOT}/folder/subfolder/otherfolder2/$0 -f
RewriteRule ^[^/.].html$ subfolder/otherfolder2/$0 [L]
# Test "subfolder/otherfolder3"
RewriteCond %{DOCUMENT_ROOT}/folder/subfolder/otherfolder3/$0 -f
RewriteRule ^[^/.].html$ subfolder/otherfolder3/$0 [L]

如果您愿意,父/folder/可以从RewriteCondTestString中抽象出来,但subfolderotherfolderN需要硬编码。(尽管subfolder可以手动分配给环境变量以避免重复。(


旁白:

RewriteCond %{REQUEST_URI} !/folder/subfolder/
RewriteCond %{REQUEST_URI} !.(css|js|jpg|gif|png|jpeg)$
RewriteRule ^(.+)/?$ /folder/subfolder/$1.html [L]

A〃;"问题";使用此代码,无论目标文件是否存在,它都会重写请求。如果您将所有请求重写到一个子文件夹,这是可以的,但如果您有多个子文件夹,则在重写之前必须检查目标文件是否存在。

这也会重写请求,即使它已经映射到现有文件。因此,/folder/目录中的任何合法文件(例如,文件结构中的filea.htmlfileb.html(都是不可访问的。

这也会重写每个文件类型(除了前面条件中列出的少数文件扩展名(。例如,它将把foo/bar/file.webp的请求重写为/folder/subfolder/foo/bar/file.webp.html。如果您只想重写.html文件,则将其包含在RewriteRule模式中,并且不需要前面的条件

最新更新