Я хотел бы перенаправить www.example.com
в example.com
. Следующий код htaccess делает это:
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
Но есть ли способ сделать это в общем виде без жесткого кодирования имени домена?
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
То же, что Майкл, за исключением этого: P
RewriteEngine On
чтобы заставить его работать.
Но если нам нужно сделать это для отдельных 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]
RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L]
...
Перенаправить не-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]
Если вы хотите сделать это в файле 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
Вот правила для перенаправления www-адреса на no-www:
#########################
# redirect www to no-www
#########################
RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]
Вот правила перенаправления URL-адреса no-www на www:
#########################
# redirect no-www to www
#########################
RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]
Обратите внимание, что я использовал флаг NE
, чтобы предотвратить переход от строки запроса к apache. Без этого флага apache изменит запрошенный URL http://www.example.com/?foo%20bar
на http://www.example.com/?foo%2250bar
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R]
RewriteCond захватывает все в переменной HTTP_HOST после "www". и сохраняет его в% 1. RewriteRule захватывает URL-адрес (без имени "/" ) и сохраняет его в $1.
sans leading "/"
- в .htaccess
(как указано в вопросе) нет начального /
, поэтому шаблон никогда не совпадает и перенаправление никогда не происходит. (В контексте сервера или виртуального хоста есть только начальная косая черта.) Кроме того, если после этого у вас есть какие-либо директивы mod_rewrite, вам понадобится флаг L
Попробуйте следующее:
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ %{HTTP_HOST}$1 [C]
RewriteRule ^www\.(.*)$ http://$1 [L,R=301]
Если хост начинается с www, мы привязываем весь хост к началу URL-адреса, а затем удаляем "www."
Там может быть много дезинформации о переадресации htaccess, я нахожу. Прежде всего, убедитесь, что ваш сайт работает в Unix с помощью Apache, а не на хосте Windows, если вы ожидаете, что этот код будет работать.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
(Убедитесь, что между каждой строкой текста нет пробелов между строками, я добавил дополнительное пространство между строками, чтобы оно выглядело нормально в этом окне.)
Это один фрагмент кода, который можно использовать для направления www-версии вашего сайта в версию http://. Существуют и другие аналогичные коды, которые также могут быть использованы.
Полный общий WWW-обработчик, http/https
Я не видел полного ответа. Я использую это для включения WWW.
Пожалуйста, дайте мне знать, как это работает или я оставил лазейку.
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]
www
на не- www
. Вы заставляете включение www
.
использование: 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";
Или .htaccess:
RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [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);
}
}
});
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]
Для тех, кому необходимо иметь доступ ко всему сайту БЕЗ префикса 'www'.
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
Обязательно добавьте его в следующий файл
/site/location/.htaccess
protossl
- вы не устанавливаете protossl
среды protossl
(это не стандартная переменная / переменная сервера). Это всегда будет пустым, поэтому всегда будет перенаправлять на http
. (Идея, лежащая в основе установки protossl
ранее в коде, заключается в том, когда вы хотите сохранить протокол при перенаправлении. Однако, в эти дни вам, вероятно, следует постоянно перенаправлять на https
.)
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,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]
Это перенаправление Non ssl
к
А SSL
к
на apache 2.4.*
вы можете выполнить это, используя директиву Redirect
с if
,
<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
Я использовал вышеприведенное правило для 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]
Выбранный ответ и многие другие решения здесь отбросили часть URL-адреса после /, поэтому в основном он всегда перенаправляется в основной домен, по крайней мере для меня.. Поэтому я добавляю рабочий образец, соблюдая полный путь после слэша..
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]
Если вы форсируете www. в url или форсировать ssl prototcol, затем попытайтесь использовать возможные варианты в файле htaccess, например:
RewriteEngine On RewriteBase / ### Force WWW ### RewriteCond %{HTTP_HOST} ^example\.com RewriteRule (.*) http://www.example.com/$1 [R=301,L] ## Force SSL ### RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://example.com/$1 [R,L] ## Block IP ### Order Deny,Allow Deny from 256.251.0.139 Deny from 199.127.0.259
RewriteCond %{SERVER_PORT} 80
я предлагаю использовать такую более универсальную проверку: RewriteCond %{HTTPS} off
Я не уверен, почему вы хотите удалить www. Но обратная версия:
# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]
И преимущество этого script: если у вас есть что-то вроде test.whattimein.com или любого другого (среды для разработки/тестирования) он не перенаправит U на исходную среду.
Единственный способ заставить меня работать...
RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
Это обновление для работы с Apache 2.4:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Единственное изменение vs Michael's заключается в удалении [NC]
, который вызывает ошибку "AH00665":
Параметр NoCase для шаблона non-regex '-f' не поддерживается и будет игнорироваться
RewriteCond %{REQUEST_FILENAME} !-f [NC]
). Флаг NC
имеет большого значения в вышеприведенном, однако причина, по которой флаг NC
должен использоваться здесь, заключается в том, чтобы перехватить небольшую часть трафика бота, который (неправильно) отправляет имя хоста в верхнем регистре.
Привет, вы можете использовать следующие правила в файле htaccess:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]