.htaccess 将请求重写到子目录(如果存在),否则重定向到子域

.htaccess rewrite requests to a subdirectory if they exist, otherwise redirect to a subdomain

我希望我的 .htaccess 文件发生一些非常具体的事情,但我不确定这是否可能。我希望将 example.com/ExampleFile.txt 之类的链接转发到 example.com/Other/ExampleFile.txt(因为我即将将所有内容移动到“其他”目录中以清理根目录。)然后如果没有检测到文件“其他”目录,我希望将用户最初键入的路径 (example.com/ExampleFile.txt) 发送到 subdomain.example.com/ExampleFile.txt.

请告诉我这是否可行,如果可行,我需要将什么代码添加到我的 .htaccess 文件中?请注意,我使用的是 LiteSpeed,而不是 Apache。

我已经可以使用以下代码完成最后一部分:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://subdomain.example.com%{REQUEST_URI} [R=302,L]

添加以下重写 before 您现有的重定向以测试请求是否在重写请求之前映射到 /Other 子目录中的文件,如果是:

# Rewrite request to the "/Other" subdirectory
#  - only if the request maps to a file or directory there
RewriteCond %{DOCUMENT_ROOT}/Other/ -f [OR]
RewriteCond %{DOCUMENT_ROOT}/Other/ -d
RewriteRule (.+) Other/ [L]

注意:如果同一个文件存在于两个根目录中(或者更确切地说,在“/Other”子目录之外),那么 /Other 子目录中的文件获胜。

如果您只想重写实际文件而不是目录,请删除第二个 条件OR 标志。

大概所有对 root 的请求都应该重写到 /Other/(因为它作为一个目录存在)所以应该无条件地执行:

# Rewrite root to "/Other/"
RewriteRule ^$ /Other/ [L]

您现有的 subdomain.example.com 重定向遵循这些重写。


更新:

But I did notice that I can't access files without the file extensions using this method. [...] Any ideas why I can't access files without the extension when using this method? I have a file called ExampleFile.txt in /Other which can be seen at example.com/ExampleFile.txt but not example.com/ExampleFile.

因为我们在重写URL.

之前必须检查请求的URL是否映射到子目录中的文件(或目录)

如果您坚持为不同类型的资源(.txt.html、图像等)使用无扩展名 URL,那么您将需要手动检查每个文件扩展名您允许对其进行无扩展(与您对指定子目录之外的请求所做的方式大致相同)。

例如:

# For files that already have an extension OR directories...
# NB: Directories could be requested initially with or without the trailing slash
# Rewrite request to the "/Other" subdirectory
#  - only if the request maps directly to a file or directory there
RewriteCond %{DOCUMENT_ROOT}/Other/ -f [OR]
RewriteCond %{DOCUMENT_ROOT}/Other/ -d
RewriteRule (.+) Other/ [L]

# Check for ".txt" files...
RewriteCond %{REQUEST_URI} !(\.\w{2,4}|/)$
RewriteCond %{DOCUMENT_ROOT}/Other/.txt -f
RewriteRule (.+) Other/.txt [L]

# Check for ".html" files...
RewriteCond %{REQUEST_URI} !(\.\w{2,4}|/)$
RewriteCond %{DOCUMENT_ROOT}/Other/.html -f
RewriteRule (.+) Other/.html [L]

# Check for ".php" files...
RewriteCond %{REQUEST_URI} !(\.\w{2,4}|/)$
RewriteCond %{DOCUMENT_ROOT}/Other/.php -f
RewriteRule (.+) Other/.php [L]

# Check for ".jpg" files...
RewriteCond %{REQUEST_URI} !(\.\w{2,4}|/)$
RewriteCond %{DOCUMENT_ROOT}/Other/.jpg -f
RewriteRule (.+) Other/.jpg [L]

# etc.