【问题标题】:Apache mod_rewrite - rewrite to folder name based on %{HTTP_HOST} - infinite loopApache mod_rewrite - 根据 %{HTTP_HOST} 重写文件夹名称 - 无限循环
【发布时间】: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


【解决方案1】:

希望这会有所帮助:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多