apache - .htaccess www 到非 www,同时保留路径、ssl 和查询字符串

标签 apache .htaccess

我试图在 .htaccess 中实现以下目标:

  1. 将 www 重定向到非 www
  2. 保留已请求的路径(例如domain.com/path/to/file.php)
  3. 保留查询字符串(如果有)(例如 domain.com/path/to/file.php?key=val&key2=val2)
  4. 保留已请求的协议(protocol)(http 或 https)

我尝试了这段代码:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]

但它不尊重 http/https,也不保留已请求的路径(例如,它将 https://www.domain.com/path/file.php 重定向到http://domain.com/file.php,当它应该重定向到 https://domain.com/path/file.php 时。)

有什么想法吗?

最佳答案

您需要检查请求是http还是https,并重定向到正确的协议(protocol)。现在,您将所有内容重定向到 http://。您可以使用此条件和分组:

RewriteCond %{HTTPS}:s (on:(s)|off:s)

这使用 %{HTTPS} 变量(“on”或“off”),并将其与 s 配对。然后我们匹配 on:(s)off:s。因此,如果 HTTPS 为“on”,则 (s) 会被分组,我们可以使用 %2 反向引用它,否则,如果 HTTPS 为“off”,则不会有任何结果已分组,%2 为空。然后我们可以在您的重定向中使用它:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^(.*)$ http%2://domain.com/$1 [R=301,L]

关于路径未被保留的第二件事,听起来您的规则位于目录 /path 中,这意味着当它通过这些规则发送时,它会被剥离。您需要将它们移至文档根目录。或者,如果您必须将规则放在 /path 目录中,则可以使用 %{REQUEST_URI} 变量:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^ http%2://domain.com%{REQUEST_URI} [R=301,L]

关于apache - .htaccess www 到非 www,同时保留路径、ssl 和查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402065/

相关文章:

python - 试图让 Pyramid 在 Apache + mod_wsgi 下运行,但它失败了

MySQL 为 WebDAV 请求生成 sleep 查询

php - 尝试使用 php 代码将特色图片上传到 wordpress 数据库

regex - 排除 URL 的重定向匹配不起作用

.htaccess - 使用 .htaccess 隐藏文件夹

php - 在ubuntu容器上添加mysql数据库

php - 保护 secret 数据免遭泄露

php - Apache URL 重写功能不正常

apache - 如何强制 http ://in htaccess?

apache 将非本地连接的 http 重写为 https