【问题标题】:How To check and remove if any subfolder exists in a Folder by Htaccess?如何通过Htaccess检查和删除文件夹中是否存在任何子文件夹?
【发布时间】:2022-01-05 14:35:48
【问题描述】:

我有这样的文件结构。

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

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

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

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

编辑

目前我在 .htaccess 中使用这个代码 sn-p

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]

【问题讨论】:

  • “现有代码 sn-p”与您发布的文件结构不匹配?也许filea.htmlfileb.html 应该在subfolder 内?
  • 我刚刚意识到您的“现有代码 sn-p”也正在删除 .html 文件扩展名,并且重写假定无扩展名 URL。如果是这种情况,那么您想要的 URL 大概是 /folder/file,而不是您在问题前面所述的 /folder/file.html
  • @MrWhite 是的,

标签: .htaccess redirect mod-rewrite url-rewriting


【解决方案1】:

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

这在.htaccess 中是不可能的。问题不在于从 URL 中删除子文件夹(尽管这应该已经在内部链接中完成),问题在于内部将请求重写回适当的子文件夹。 .htaccess 中没有“搜索”任意文件的内置机制。

如果您的已知子文件夹数量有限,那么您可以这样做,但您需要为每个子文件夹添加一个规则(在根 .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]

如果您愿意,可以从RewriteCond TestString 中抽象出父 /folder/,但需要对 subfolderotherfolderN 进行硬编码。 (虽然subfolder 可以手动分配给环境变量以节省重复。)


旁白:

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

此代码的一个“问题”是,无论目标文件是否存在,它都会重写请求。如果您将所有请求重写到单个子文件夹,这是可以的,但如果您有多个子文件夹,那么您必须在重写之前检查目标文件是否存在。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2016-05-04
    相关资源
    最近更新 更多