слова с диакритическим знаком в электронном письме подвергают интервал повреждения - как я останавливаю это?

Куда поместить правила mod_rewrite

mod_rewrite, правила могут быть помещены в httpd.conf файл, или в .htaccess файл. если у Вас будет доступ к [1 114], то помещение правил здесь предложит выигрыш в производительности (поскольку правила обрабатываются однажды, в противоположность каждому разу .htaccess, файл называют).

Вход mod_rewrite запросы

Вход может быть включен из httpd.conf файл (включая [1 117]):

# logs can't be enabled from .htaccess
# loglevel > 2 is really spammy!
RewriteLog /path/to/rewrite.log
RewriteLogLevel 2

случаи Общего использования

  1. Для направления всех запросов к единственной точке:

    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 .

  2. Обработка 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]
    
  3. SSL

    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://example.com/$1 [R,L]
    
  4. Принуждения Общие флаги:

    • [R] или [redirect] - вызывают перенаправление (значения по умолчанию к 302 временным перенаправлениям)
    • [R=301], или [redirect=301] - вызывают 301 постоянное перенаправление
    • [L], или [last] - прекращают переписывать процесс (см. примечание ниже в распространенных ошибках)
    • [NC] или [nocase] - указывают, что соответствие должно быть нечувствительно к регистру


    Используя подробную форму флагов, часто более читаемо и поможет другим, которые приезжают для чтения кода позже.

    можно разделить несколько флагов с запятой:

    RewriteRule ^olddir(.*)$ /newdir$1 [L,NC]
    

Распространенные ошибки

  1. Смешивание 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], но это включает больше работы, чем просто обработка основных перенаправлений как выше.

  2. Контекст влияет на синтаксис

    В [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
    
  3. [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), который не заставит запрос быть повторно проанализированным.

7
задан Community 23 May 2017 в 11:44
поделиться

3 ответа

Вам также необходимо закодировать пространство между ними (см. 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);
}
5
ответ дан 7 December 2019 в 05:26
поделиться

Найдите преобразование mbstring и UTF. Многие специальные символы неанглийских языков обрабатываются в наборе символов UTF8.

Преобразование строки темы в UTF8 и обеспечение того, чтобы письмо было отправлено как таковое, должно правильно отображать строки темы.

По крайней мере, это сделал для нас, когда у нас была аналогичная проблема с отправкой электронной почты

1
ответ дан 7 December 2019 в 05:26
поделиться

Похоже, вам лучше отправить Subject: =? ISO-8859-1? Q? = C1ngel R = EDos escucha y sorprende? = , в качестве проблемы появляется рядом с концом? = кодировки.

0
ответ дан 7 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: