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

#apache #.htaccess #mod-rewrite #webserver #mod-expires

#apache #.htaccess #мод-переписать #веб-сервер #мод-истекает

Вопрос:

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

  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>
 

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

Ответ №1:

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

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

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

Кроме того, обработка одного или двух сегментов пути (первая и вторая 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 на вашем сайте, поэтому только вы можете действительно ответить на этот … тестовый тестовый тест.

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

Комментарии:

1. Большое вам спасибо! Этот очень подробный ответ действительно помог мне 🙂 Моя структура URL довольно проста, всего несколько HTML- и PHP-файлов в корневом каталоге и еще несколько в подкаталоге, поэтому я думаю, что это сработает для меня!

2. Я только что внедрил и протестировал код: он работает безупречно! Еще раз спасибо 🙂