Универсальный htaccess перенаправляет www на не-www

Я хотел бы перенаправить www.example.com to example.com. Следующий код htaccess делает это:

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

но, есть ли способ сделать это в общем виде, без жесткого кодирования имени домена?

21 ответов


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

же Майкл кроме этого работает: P


но если нам нужно сделать это для отдельных http и https:

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

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

редирект non-www to www (оба: http + https)

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

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

Если вы хотите сделать это в httpd.conf файл, вы можете сделать это без mod_rewrite (и, по-видимому, это лучше для производительности).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

Я получил этот ответ здесь: https://serverfault.com/questions/120488/redirect-url-within-apache-virtualhost/120507#120507


вот правила перенаправления URL www на no-www:

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

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

вот правила перенаправления URL-адреса no-www на www:

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

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

обратите внимание, что я использовал NE флаг для предотвращения выхода apache из строки запроса. Без этого флага apache изменит запрошенный URL http://www.example.com/?foo%20bar to http://www.example.com/?foo%2250bar


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

RewriteCond захватывает все в переменной HTTP_HOST после " www."и сохраняет его в %1. RewriteRule захватывает URL (без ведущего "/") и сохраняет его в $1.


попробуйте это:

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

если хост начинается с www, мы вставляем весь хост в начало URL-адреса, а затем снимаем "www."


там может быть много дезинформации о перенаправлениях htaccess, я нахожу. Во-первых, убедитесь, что ваш сайт работает в Unix с помощью Apache, а не на хосте Windows, Если вы ожидаете, что этот код будет работать.

RewriteEngine On

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

RewriteRule ^(.*)$ http://%1/ [R=301,L] 

(убедитесь, что между каждой строкой текста нет пробелов; я добавил дополнительное пространство между строками, чтобы оно было в порядке в этом окне.)

Это один фрагмент кода, который можно использовать для направления www-версии вашего сайта на версия http. Есть и другие подобные коды,которые можно использовать.


полный универсальный обработчик WWW, http / https

Я не видел полного ответа. Я использую это для обработки включения WWW.

  1. Generic. Не требует информации о домене.
  2. силы WWW на первичном домене: www.domain.com
  3. удаляет WWW на поддоменах: sub.domain.com
  4. сохраняет статус HTTP / HTTPS.
  5. разрешает отдельные cookies для домена / поддоменов

пожалуйста, дайте мне знать, как это работает или если я оставил лазейку.

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]

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

в подпапке


для тех, кто должен иметь доступ ко всему сайту без префикс 'www'.

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

Mare обязательно добавьте это в следующий файл

/site/location/.htaccess 

www на не www с https

RewriteEngine on

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

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

использование: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

или .реврайт:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/ [R=301,L]

и метод PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

я использовал вышеупомянутое правило для FWD www без www, и он отлично работает для домашней страницы, однако на внутренних страницах они пересылаются в / index.в PHP

Я нашел это другое правило в моем .htaccess файл, который вызывает это, но не уверен, что с ним делать. Любые предложения были бы замечательными:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

если вы хотите удалить www на http и https использовать следующий :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

это редиректы Не протокол SSL

to

и Протокол SSL

to

на apache 2.4.* вы можете сделать это с помощью Redirect С if директива,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

Я не уверен, почему вы хотите удалить ВСП. Но обратная версия будет:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/ [R=permanent,L]

и преимуществом этого скрипта является: если у вас есть что-то вроде test.whattimein.com или любые другие (среды для разработки / тестирования) он не перенаправит U в исходную среду.


единственный способ заставить его работать...

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/ [R=301,L]

Если вы заставляете www. в url или принудительном ssl prototcol, затем попробуйте использовать возможные варианты в файле htaccess, такие как:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Force SSL ###

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/ [R,L]

## Block  IP's ###
Order Deny,Allow
Deny from 256.251.0.139
Deny from 199.127.0.259

выбранный ответ и многие другие решения здесь отбросили часть url после /, поэтому в основном он всегда перенаправлялся в основной домен, по крайней мере для меня.. Поэтому я добавляю рабочий образец, соблюдая полный путь после Слэша..

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

это обновлено для работы на Apache 2.4:

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

единственное изменение vs Майкл убрать [NC], что приводит к ошибке "AH00665":

опция NoCase для шаблона non-regex '- f' не поддерживается и будет проигнорирована


привет вы можете использовать следующие правила на ваш файл. htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/ [R=301,L]