Apache mod_rewrite - 根据 %{HTTP_HOST} 重写文件夹名称 - 无限循环
Apache mod_rewrite - rewrite to folder name based on %{HTTP_HOST} - infinite loop
我目前遇到了 mod_rewrite 的无限循环问题。
我想要的(按顺序应用规则):
- 剥离 www(重定向)
- 重写请求以便使用名为 %{HTTP_HOST}(如果存在)的文件夹中的文件
- 如果文件夹不存在,重定向到domain.tld
示例:
- www.subdomain.domain.tld => 重定向到子域。domain.tld
- subdomain.domain.tld => 在名为 subdomain.domain.tld 的文件夹中加载文件。domain.tld(并传递请求的其余部分)
- 未知子域。domain.tld => 重定向到 domain.tld
到目前为止我得到了什么:
RewriteEngine On
# Store protocol (HTTP or HTTPS) as ENV variable
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
# Stript www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301]
# Directory exists => rewrite
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC]
RewriteCond %{HTTP_HOST} -d
RewriteRule ^ %{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA]
# Directory doesn't exist => redirect
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC]
RewriteCond %{HTTP_HOST} !-d
RewriteRule ^ %{ENV:proto}://domain.tld%{REQUEST_URI} [L,NC,QSA,R]
我知道这一切都可以通过虚拟主机来实现。不幸的是,我已经在一个共享的虚拟主机上了,我只能使用 .htaccess,所以我有点被迫那样做。
感谢您提供的任何帮助或想法,让我朝着正确的方向前进。
希望对您有所帮助:
RewriteEngine On
RewriteBase "/"
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
# Strip www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301]
#Prevent loop
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
# Directory exists => rewrite
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} -d
RewriteRule ^ /%{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA]
# Directory doesn't exist => redirect (but not if host=example.com)
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} !-d
RewriteCond %{HTTP_HOST} !=example.com
RewriteRule ^ %{ENV:proto}://example.com%{REQUEST_URI} [L,NC,QSA,R]
我目前遇到了 mod_rewrite 的无限循环问题。
我想要的(按顺序应用规则):
- 剥离 www(重定向)
- 重写请求以便使用名为 %{HTTP_HOST}(如果存在)的文件夹中的文件
- 如果文件夹不存在,重定向到domain.tld
示例:
- www.subdomain.domain.tld => 重定向到子域。domain.tld
- subdomain.domain.tld => 在名为 subdomain.domain.tld 的文件夹中加载文件。domain.tld(并传递请求的其余部分)
- 未知子域。domain.tld => 重定向到 domain.tld
到目前为止我得到了什么:
RewriteEngine On
# Store protocol (HTTP or HTTPS) as ENV variable
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
# Stript www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301]
# Directory exists => rewrite
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC]
RewriteCond %{HTTP_HOST} -d
RewriteRule ^ %{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA]
# Directory doesn't exist => redirect
RewriteCond %{REQUEST_URI} !^/%{HTTP_HOST} [NC]
RewriteCond %{HTTP_HOST} !-d
RewriteRule ^ %{ENV:proto}://domain.tld%{REQUEST_URI} [L,NC,QSA,R]
我知道这一切都可以通过虚拟主机来实现。不幸的是,我已经在一个共享的虚拟主机上了,我只能使用 .htaccess,所以我有点被迫那样做。
感谢您提供的任何帮助或想法,让我朝着正确的方向前进。
希望对您有所帮助:
RewriteEngine On
RewriteBase "/"
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=proto:http]
RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=proto:https]
# Strip www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{ENV:proto}://%1%{REQUEST_URI} [L,NC,QSA,R=301]
#Prevent loop
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
# Directory exists => rewrite
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} -d
RewriteRule ^ /%{HTTP_HOST}%{REQUEST_URI} [L,NC,QSA]
# Directory doesn't exist => redirect (but not if host=example.com)
RewriteCond %{DOCUMENT_ROOT}/%{HTTP_HOST} !-d
RewriteCond %{HTTP_HOST} !=example.com
RewriteRule ^ %{ENV:proto}://example.com%{REQUEST_URI} [L,NC,QSA,R]