【发布时间】:2016-09-04 13:22:04
【问题描述】:
我目前遇到了 mod_rewrite 的无限循环问题。
我想要什么(按顺序应用的规则):
- 剥离 www(重定向)
- 重写请求,以便使用文件夹中名为 %{HTTP_HOST}(如果存在)的文件
- 如果文件夹不存在,重定向到 domain.tld
例子:
- www.subdomain.domain.tld => 重定向到 subdomain.domain.tld
- subdomain.domain.tld => 在名为 subdomain.domain.tld 的文件夹中加载文件(并传递请求的其余部分)
- unknown-subdomain.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,所以我不得不这样做。
感谢任何帮助或想法引导我走向正确的方向。
【问题讨论】:
-
您在哪里寻找目录?此外,如果您的所有子域都支持 HTTPS,请始终将您的用户重定向到 SSL 连接。
-
目录与 .htaccess 位于同一文件夹中。协议的保存更多的是一种噱头,因为它在开发环境中不受支持。如果可能的话,你总是使用 HTTPS 是绝对正确的,最终版本也是如此。
-
什么是apache版本?
标签: apache .htaccess redirect mod-rewrite virtualhost