通用htaccess将www重定向到非www

dee*_*ell 478 apache mod-rewrite url-rewriting

我想重定向www.example.comexample.com.以下htaccess代码实现了这一点:

RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法以通用方式执行此操作而不对域名进行硬编码?

小智 873

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

迈克尔相同,除了这个有效:P

  • 它将`http:// www.domain.com /`重定向到`http:// domain.com //`.你应该在`RewruteRule`中添加`/`.这适用于我`RewriteRule ^ /(.*)$ http://%1/$ 1 [R = 301,L]`. (18认同)
  • 如果它不起作用,你可能会错过`RewriteEngine On`前体使它工作. (16认同)
  • 我和弗拉基米尔有同样的问题,它用双斜线重定向到`http:// domain.com //`.所以我做了'RewriteRule ^(.*)$ http://%1 $ 1 [R = 301,L]`它似乎到目前为止工作 (13认同)
  • @Ben,我将如何反向使用这个*添加*www到非www网站? (8认同)
  • 请使用以下解决方案而不是重写引擎,优雅更快:http://stackoverflow.com/questions/1100343/apache-redirect-from-non-www-to-www (5认同)
  • 这会将子文件夹 www.example.com/sub/index.php 变为 example.com/index.php (2认同)
  • 在 2018 年,这现在应该是最后一行的 https://。我使用此代码原样以及单独的 HTTPS 重定向陷入了一个鬼鬼祟祟的混合内容警告。 (2认同)
  • @matteo @Vladimir 的双斜杠问题是由于尝试在 _server_ (或 _virtualhost_)上下文中使用这些指令引起的。上述指令是为“.htaccess”(目录上下文)编写的。如果您位于服务器上下文中,那么您可能不应该使用 mod_rewrite 来执行此任务,而是在适当的虚拟主机中使用 mod_alias `Redirect` 指令,如 @Birla 链接到上面。 (2认同)

And*_*ron 109

但是如果我们需要为单独的http和https执行此操作:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

  • @BobbyS我在[本文](https://simonecarletti.com/blog/2016/08/redirect-domain-http-https-www-apache/)中使用了该解决方案.它将www和HTTP重定向到非www HTTPS,并处理尾随的`/`. (3认同)
  • www.example.com/重定向到example.com//是否可以删除多余的斜杠? (2认同)

Dmi*_*riy 71

非www重定向到www(两者:http + https)

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

  • @nightcoder这是因为我反向重定向的解决方案(从非www到www)而不是Andron的 (4认同)
  • 注意:如果您打算将子域名用于其他目的,此解决方案可能会导致一些问题。例如,app.yourdomain.com将被重定向到www.app.yourdomain.com。 (2认同)
  • 这与问题的答案完全相反。 (2认同)

Wil*_*iss 44

如果你想在httpd.conf文件中执行此操作,则可以在没有mod_rewrite的情况下执行此操作(显然它对性能更好).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我在这里得到了答案:https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507


Sal*_*n A 33

以下是将www URL重定向到no-www的规则:

#########################
# redirect www to no-www
#########################

RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]
Run Code Online (Sandbox Code Playgroud)

以下是将无www URL重定向到www的规则:

#########################
# redirect no-www to www
#########################

RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]
Run Code Online (Sandbox Code Playgroud)

请注意,我使用NEflag来阻止apache转义查询字符串.如果没有此标志,apache会将请求的URL更改http://www.example.com/?foo%20barhttp://www.example.com/?foo%2250bar


Mic*_*mer 11

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R]
Run Code Online (Sandbox Code Playgroud)

RewriteCond 在"www" 之后捕获HTTP_HOST变量中的所有内容.并将其保存在%1中.RewriteRule捕获URL(没有前导"/")并将其保存在$ 1中.

  • `sans 前导“/”` - 在`.htaccess`(如问题所述)中没有前导`/`,因此模式永远不会匹配并且重定向永远不会发生。(在 _server_ 或 _virtualhost_ 上下文中只有一个前导斜杠。)此外,如果您在此之后有任何 mod_rewrite 指令,那么您将需要 `L` 标志。 (2认同)

Gre*_*reg 7

试试这个:

RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ %{HTTP_HOST}$1 [C]
RewriteRule ^www\.(.*)$ http://$1 [L,R=301]
Run Code Online (Sandbox Code Playgroud)

如果主机以www开头,我们将整个主机粘贴到URL的起点,然后取下"www".

  • 我正在使用Apache/2.2.9(Unix).它适用于www.website,它重定向到网站但是对于以下内容:http://www.website/test - >转到:http://www.websitetest/我通过添加另一个/第二个错误修复此问题:http: //www.website/test/n转到http://www.websitetest/n/n (2认同)

Gre*_*gor 7

完整的通用WWW处理程序,http/https

我没有看到完整的答案.我用它来处理WWW包含.

  1. 通用.不需要域信息.
  2. 在主域名上强制WWW:www.domain.com
  3. 删除子域名上的WWW:sub.domain.com
  4. 保留HTTP/HTTPS状态.
  5. 允许域/子域的单个cookie

请告诉我这是如何工作的,或者我是否留下了漏洞.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)


小智 6

我发现,有很多关于htaccess重定向的错误信息.首先,如果您希望此代码能够运行,请确保您的站点在使用Apache的Unix上运行,而不是在Windows主机上运行.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 
Run Code Online (Sandbox Code Playgroud)

(确保每行文本之间没有行间距;我在行之间添加了一个额外的空格,以便在此窗口中呈现正常.)

这是一段代码,可用于将您网站的www版本指向http://版本.还可以使用其他类似的代码.


Raj*_*ran 5

www 到非 www 的 https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)