mod_rewrite
, правила могут быть помещены в httpd.conf
файл, или в .htaccess
файл. если у Вас будет доступ к [1 114], то помещение правил здесь предложит выигрыш в производительности (поскольку правила обрабатываются однажды, в противоположность каждому разу .htaccess
, файл называют).
Вход может быть включен из httpd.conf
файл (включая [1 117]):
# logs can't be enabled from .htaccess
# loglevel > 2 is really spammy!
RewriteLog /path/to/rewrite.log
RewriteLogLevel 2
Для направления всех запросов к единственной точке:
RewriteEngine on
# ignore existing files
RewriteCond %{REQUEST_FILENAME} !-f
# ignore existing directories
RewriteCond %{REQUEST_FILENAME} !-d
# map requests to index.php and append as a query string
RewriteRule ^(.*)$ index.php?query=$1
Начиная с Apache 2.2.16 можно также использовать FallbackResource
.
Обработка 301/302 перенаправления:
RewriteEngine on
# 302 Temporary Redirect (302 is the default, but can be specified for clarity)
RewriteRule ^oldpage\.html$ /newpage.html [R=302]
# 301 Permanent Redirect
RewriteRule ^oldpage2\.html$ /newpage.html [R=301]
Примечание : внешние перенаправления являются неявно 302 перенаправлениями:
# this rule:
RewriteRule ^somepage\.html$ http://google.com
# is equivalent to:
RewriteRule ^somepage\.html$ http://google.com [R]
# and:
RewriteRule ^somepage\.html$ http://google.com [R=302]
SSL
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Принуждения Общие флаги:
[R]
или [redirect]
- вызывают перенаправление (значения по умолчанию к 302 временным перенаправлениям) [R=301]
, или [redirect=301]
- вызывают 301 постоянное перенаправление [L]
, или [last]
- прекращают переписывать процесс (см. примечание ниже в распространенных ошибках) [NC]
или [nocase]
- указывают, что соответствие должно быть нечувствительно к регистру
Используя подробную форму флагов, часто более читаемо и поможет другим, которые приезжают для чтения кода позже.
можно разделить несколько флагов с запятой:
RewriteRule ^olddir(.*)$ /newdir$1 [L,NC]
Смешивание mod_alias
стиль перенаправляет с [1 128]
# Bad
Redirect 302 /somepage.html http://example.com/otherpage.html
RewriteEngine on
RewriteRule ^(.*)$ index.php?query=$1
# Good (use mod_rewrite for both)
RewriteEngine on
# 302 redirect and stop processing
RewriteRule ^somepage.html$ /otherpage.html [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# handle other redirects
RewriteRule ^(.*)$ index.php?query=$1
Примечание : можно смешаться mod_alias
с [1 130], но это включает больше работы, чем просто обработка основных перенаправлений как выше.
Контекст влияет на синтаксис
В [1 131] файлы, ведущая наклонная черта не используется в шаблоне RewriteRule:
# given: GET /directory/file.html
# .htaccess
# result: /newdirectory/file.html
RewriteRule ^directory(.*)$ /newdirectory$1
# .htaccess
# result: no match!
RewriteRule ^/directory(.*)$ /newdirectory$1
# httpd.conf
# result: /newdirectory/file.html
RewriteRule ^/directory(.*)$ /newdirectory$1
# Putting a "?" after the slash will allow it to work in both contexts:
RewriteRule ^/?directory(.*)$ /newdirectory$1
[L] не является последним! (иногда)
Эти [L]
остановки по требованию, обрабатывающие дальше, переписывают правила для этого, проходят через набор правила . Однако, если URL был изменен в той передаче, и Вы находитесь в .htaccess
контекст или эти
раздел, затем Ваш измененный запрос будет пасуемым назад через механизм парсинга URL снова. И на следующей передаче, это может соответствовать другому правилу на этот раз. Если Вы не понимаете это, это часто похоже на Ваш [L]
, флаг не имел никакого эффекта.
# processing does not stop here
RewriteRule ^dirA$ /dirB [L]
# /dirC will be the final result
RewriteRule ^dirB$ /dirC
Наш переписывать журнал показывает, что правила выполняются дважды, и URL обновляется дважды:
rewrite 'dirA' -> '/dirB'
internal redirect with /dirB [INTERNAL REDIRECT]
rewrite 'dirB' -> '/dirC'
лучший способ вокруг этого состоит в том, чтобы использовать [END]
флаг (, видят документы Apache ) вместо эти [L]
флаг, если Вы действительно хотите остановить всю последующую обработку правил (и последующие передачи). Однако эти [END]
флаг только доступен для [1 185] Apache v2.3.9 + , поэтому если у Вас есть v2.2 или ниже, Вы застреваете только с эти [L]
флаг.
Для более ранних версий, необходимо полагаться RewriteCond
операторы для предотвращения соответствия правил о последующих передачах механизма парсинга URL.
# Only process the following RewriteRule if on the first pass
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ...
Или необходимо удостовериться, что RewriteRule находятся в контексте (т.е. httpd.conf
), который не заставит запрос быть повторно проанализированным.
Вам также необходимо закодировать пространство между ними (см. RFC 2047 ):
(=? ISO-8859-1? Q? a? = =? ISO-8859-1? Q? b? =) (ab)
Пробел между соседними закодированными словами не отображается.
[…]
(=? ISO-8859-1? Q? A_b? =) (Ab)
Чтобы вызвать ПРОБЕЛ, отображаемый в части закодированного текста, ПРОБЕЛ ДОЛЖЕН быть закодирован как часть «закодированного слова».
(=? ISO-8859-1? Q? A? = =? ISO-8859-2? Q? _B? =) (Ab)
Чтобы вызвать ПРОБЕЛ, отображаемый между двумя строками закодированного текста, ПРОБЕЛ МОЖЕТ быть закодирован как часть одного из «закодированных слов».
Это должно сделать это:
Subject: =?ISO-8859-1?Q?=C1ngel=20R=EDos?= escucha y sorprende
Изменить ] Попробуйте эту функцию:
function _encodeHeader($str, $charset='ISO-8859-1')
{
$words = preg_split('/(\s+)/', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$func = create_function('$match', 'return $match[0] === " " ? "_" : sprintf("=%02X", ord($match[0]));');
$encoded = false;
foreach ($words as $key => &$word) {
if (!ctype_space($word)) {
$tmp = preg_replace_callback('/[^\x21-\x3C\x3E-\x5E\x60-\x7E]/', $func, $word);
if ($tmp !== $word) {
if (!$encoded) {
$word = '=?'.$charset.'?Q?'.$tmp;
} else {
$word = $tmp;
if ($key > 0) {
$words[$key-1] = preg_replace_callback('/[^\x21-\x3C\x3E-\x5E\x60-\x7E]/', $func, $words[$key-1]);
}
}
$encoded = true;
} else {
if ($encoded) {
$words[$key-2] .= '?=';
}
$encoded = false;
}
}
}
if ($encoded) {
$words[$key] .= '?=';
}
return implode('', $words);
}
Найдите преобразование mbstring и UTF. Многие специальные символы неанглийских языков обрабатываются в наборе символов UTF8.
Преобразование строки темы в UTF8 и обеспечение того, чтобы письмо было отправлено как таковое, должно правильно отображать строки темы.
По крайней мере, это сделал для нас, когда у нас была аналогичная проблема с отправкой электронной почты
Похоже, вам лучше отправить Subject: =? ISO-8859-1? Q? = C1ngel R = EDos escucha y sorprende? =
, в качестве проблемы появляется рядом с концом? = кодировки.