如何使用 htaccess 编写子域?

How to write a subdomain with htaccess?

我正在尝试通过 htaccess 文件转发一个子域。下面的指令会将 http://sub.domain.com 转发到内部结构 Root > subfolder > index.php。这一切都很好。

# REWRITE DEFAULTS
# ====================================================================================================
RewriteEngine On
RewriteBase /

# SUBDOMAIN FORWARD
# ====================================================================================================
RewriteCond %{HTTP_HOST} ^sub.domain.com$ 
RewriteRule ^(/)?$ subfolder/index.php [L]

RewriteCond %{HTTP_HOST} ^sub.domain.com$ 
RewriteCond %{REQUEST_URI} !^/subfolder/
RewriteRule ^(.*)$ /subfolder/ 

这种方法只有一个(大)失败。当您尝试通过转到 http://sub.domain.com/images/ 到达子文件夹中的文件夹时,例如 Root > subfolder > images 然后一切正常, 但是 当您不结束它时一个斜线http://sub.domain.com/images地址栏中的url会变成http://sub.domain.com/subfolder/images/这显然不是我想要的。

那么,如果忘记了斜杠,我会添加一个斜杠怎么办?

RewriteCond %{HTTP_HOST} ^(.*).domain.com$ 
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ http://%1.domain.com// [L,R=301]

当你有一个正常的 URL (http://www.domain.com/images) 时,这一切都有效,因为它会检测到它是一个目录并添加一个斜线,如果它是一个文件,它将省略斜线。但是,这不适用于我们的 http://sub.domain.com/images 示例。

有没有人知道如何使用 htaccess 使子域正常工作?

发生这种情况是因为 /subfolder/images 是一个真实目录,并且 mod_dir 模块通过执行 301 重定向向所有目录添加尾部斜杠。

你可以这样使用它:

RewriteEngine On

# add a trailing slash if /subfolder/images is a directory
RewriteCond %{HTTP_HOST} ^sub\.domain\.com$ [NC]
RewriteCond %{DOCUMENT_ROOT}/subfolder// -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L,NE,R=302]

RewriteCond %{HTTP_HOST} ^sub\.domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/subfolder/
RewriteRule ^(.*)$ /subfolder/ [L]