.htaccess从URL +目录中删除WWW

Cyc*_*dge 51 url .htaccess mod-rewrite no-www

这对许多人来说似乎不是问题(读:我找不到答案),但我想更新以下htaccess代码,不仅要从URL中删除'www',还要删除任何子代码访问的目录.

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

有了这个,http://www.example.com/any/解决得很好,但是我希望它像root一样重定向到http://example.com/any/.

小智 136

我有同样的问题(从指向附加域上的子目录的URL中剥离'www'的问题),但经过一些试验和错误后,这似乎对我有用:

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

  • 如果用户输入"https:// www.domain.com/log-me-in"怎么办?他将被重定向到`http`.所以我需要从`http`到`https`进行另一次重写? (4认同)
  • 很好的答案 - 这通常没有任何编辑工作......只需将其放入您的.htaccess文件即可. (2认同)
  • 这是从主机地址中删除www的最佳答案,因为您不对域名进行硬编码,因此您可以轻松地将更改推送到远程服务器,而无需修改.htaccess.感谢您的回答. (2认同)
  • @TheFrost 是的,`RewriteCond %{HTTPS} off` `RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]` (2认同)

mik*_*kep 19

非www => www和对面www =>非www的重定向代码..htaccess文件中没有硬编码域和方案.因此将保留原始域和http/https版本.

APACHE 2.4和NEWER

非WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

WWW =>非WWW:

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

注意:不在Apache 2.2上工作,其中%{REQUEST_SCHEME}不可用.为了与Apache 2.2兼容,请使用下面的代码或将%{REQUEST_SCHEME}替换为固定的http/https.


APACHE 2.2和NEWER

非WWW => WWW:

RewriteEngine On

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

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

...或更短的版本......

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

WWW =>非WWW:

RewriteEngine On

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

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

...短版本不可能,因为%N只能从最后一个RewriteCond获得...


Jas*_*ary 12

我认为你很接近,但请尝试以下方法:

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

不确定你对子目录的确切含义,但这是你的例子.