#apache #.htaccess #mod-rewrite #webserver #mod-expires
#apache #.htaccess #мод-переписать #веб-сервер #мод-истекает
Вопрос:
Я ничего не знаю.htaccess-файлы, кроме самых основ.
Я скопировал и вставил этот код из разных источников в Интернете, и до сих пор он работает. Код (a) определяет страницу с ошибкой 404, (b) определяет, как долго определенные файлы должны быть «сохранены», (c) удаляет .html-расширение из всех URL-адресов и (d) добавляет к ним завершающую косую черту. Я просто хочу знать две вещи:
- Как я могу применить этот код не только к .html-файлам, но и к .php-файлам? Я подозреваю, что мне нужно изменить строку 6, но я не уверен.
- Есть ли какие-либо мнения от более опытных пользователей о том, насколько удобен для сервера этот код?Как я уже сказал, я просто скопировал код, но я хочу знать, есть ли какие-либо ненужные перенаправления, возможные 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. Я только что внедрил и протестировал код: он работает безупречно! Еще раз спасибо 🙂