Как сделать этот .htaccess удобным для сервера и применить к .php?

Я ничего не знаю о .htaccess-файлах, кроме самых основ.
Я скопировал и вставил этот код из разных источников в Интернете, и пока он работает. Код (а) определяет страницу с ошибкой 404, (б) определяет, как долго должны сохраняться определенные файлы, (в) удаляет расширение .html со всех URL-адресов и (г) добавляет к ним завершающую косую черту. Я просто хочу знать две вещи:

  1. Как мне применить этот код не только для .html-файлов, но и для .php-файлов? Я подозреваю, что мне нужно изменить строку 6, но я не уверен.
  2. Есть ли мнения более опытных пользователей о том, насколько удобен этот код для сервера? Как я уже сказал, я просто скопировал код, но хочу знать, нет ли ненужных редиректов, возможных SEO-штрафов или что-то вроде того.

Это код, который я использую в файле .htaccess:

ErrorDocument 404 /404.html
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ $1.html
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ /$1/ [R=301,L]
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/html "access plus 0 seconds"
  ExpiresByType text/css "access plus 1 week"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-javascript "access plus 1 month"
  ExpiresByType audio/ogg "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType video/mp4 "access plus 1 month"
  ExpiresByType video/ogg "access plus 1 month"
  ExpiresByType video/webm "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
</IfModule>

Спасибо за помощь!


person Community    schedule 13.01.2021    source источник


Ответы (1)


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ $1.html
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.html

Вы не можете просто изменить строку 6 для обработки .php файлов. Так как вы вносите двусмысленность. Например, должен ли запрос /foo сопоставляться с .html или .php? Вам нужно расставить приоритеты между тем и другим и проверить наличие соответствующего файла .php или .html.

Между прочим, директивы RewriteCond применяются только к первой следующей директиве RewriteRule, поэтому вторая директива RewriteRule обрабатывается безоговорочно. (Хотя здесь вам не нужна проверка файлов, так как имена файлов не заканчиваются косой чертой.)

Кроме того, обработка одного или двух сегментов пути (первая и вторая директивы RewriteRule соответственно) может быть объединена в одно правило.

Вместо этого попробуйте следующее для обработки файлов .html и .php. Я предполагаю, что файлы .php имеют приоритет. Таким образом, если вы запрашиваете /foo, а foo.php и foo.html существуют, то будет обслуживаться foo.php (foo.html будет доступен только в том случае, если вы запросите его напрямую).

# Rewrite request to ".php" if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^((/?[^/]+){1,2})/$ $1.php [L]

# Otherwise, rewrite request to ".html" if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^((/?[^/]+){1,2})/$ $1.html [L]

Обратите также внимание на включение флага L (last).

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ /$1/ [R=301,L]

Эти директивы можно упростить и оптимизировать, переместив тест в 3-м условии в RewriteRule шаблон и избежать ненужных проверок файловой системы.

Например:

# Append trailing slash if omitted
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !(^$|\.[a-zA-Z0-9]{1,5}|/)$ %{REQUEST_URI}/ [R=301,L]

Кроме того, эти правила, возможно, расположены в неправильном порядке (хотя в данном случае это, вероятно, не будет иметь значения). Как правило, внешнее перенаправление (см. выше) должно выполняться перед внутренними перезаписи, которые добавляют расширения .php или .html, чтобы избежать непреднамеренного перенаправления внутренних перезаписей.

Таким образом, первая часть файла становится:

ErrorDocument 404 /404.html

RewriteEngine On

# Append trailing slash if omitted
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !(^$|\.[a-zA-Z0-9]{1,5}|/)$ %{REQUEST_URI}/ [R=301,L]

# Rewrite request to ".php" if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^((/?[^/]+){1,2})/$ $1.php [L]

# Otherwise, rewrite request to ".html" if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^((/?[^/]+){1,2})/$ $1.html [L]

Затем следуют директивы mod_expires...

ExpiresByType application/javascript "access plus 1 month"
ExpiresByType application/x-javascript "access plus 1 month"

Требуется только одна из этих директив. Ваш сервер будет либо обслуживать JS-файлы с application/javascript mime-типом ИЛИ application/x-javascript. Не может (не должно) быть и то, и другое. Скорее всего бывший.

... насколько удобен для сервера этот код? Как я уже сказал, я просто скопировал код, но хочу знать, есть ли какие-то ненужные редиректы, возможные SEO-штрафы или что-то в этом роде.

Не уверен, что вы подразумеваете под дружественным к серверу. Но в остальном, работает ли это так, как задумано, без ненужных перенаправлений, действительно зависит от структуры URL-адресов на вашем сайте, поэтому только вы можете действительно ответить на этот... тест тест тест.

Но в остальном после этих обновлений все выглядит нормально.

person MrWhite    schedule 13.01.2021
comment
Большое спасибо! Этот очень подробный ответ действительно помог мне :) Моя структура URL довольно проста, всего несколько HTML- и PHP-файлов в корне и еще несколько в подкаталоге, поэтому я думаю, что это сработает для меня! - person ; 13.01.2021
comment
Я только что реализовал и протестировал код: он работает безупречно! Спасибо еще раз :) - person ; 13.01.2021