我有这样的文件结构。
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/
可以从RewriteCond
TestString中抽象出来,但subfolder
和otherfolderN
需要硬编码。(尽管subfolder
可以手动分配给环境变量以避免重复。(
旁白:
RewriteCond %{REQUEST_URI} !/folder/subfolder/ RewriteCond %{REQUEST_URI} !.(css|js|jpg|gif|png|jpeg)$ RewriteRule ^(.+)/?$ /folder/subfolder/$1.html [L]
A〃;"问题";使用此代码,无论目标文件是否存在,它都会重写请求。如果您将所有请求重写到一个子文件夹,这是可以的,但如果您有多个子文件夹,则在重写之前必须检查目标文件是否存在。
这也会重写请求,即使它已经映射到现有文件。因此,/folder/
目录中的任何合法文件(例如,文件结构中的filea.html
和fileb.html
(都是不可访问的。
这也会重写每个文件类型(除了前面条件中列出的少数文件扩展名(。例如,它将把foo/bar/file.webp
的请求重写为/folder/subfolder/foo/bar/file.webp.html
。如果您只想重写.html
文件,则将其包含在RewriteRule
模式中,并且不需要前面的条件。