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