Чи має значення, в якому порядку розміщуються правила htaccess?


9

Я сподіваюся, що це проста відповідь ТАК чи НІ (будь ласка, вкажіть, чому)

Q1: Неважливо, у якому порядку правила розміщуються у htaccess? Оскільки вони є повністю відокремленими предметами: наприклад

Q2: Якщо так, чи я застосовую правильне замовлення? щоб пришвидшити двигун htacces і не перевантажити його непотрібними правилами?

Q3: будь-які поради щодо того, що тут відключити / додати, є привітанням +1!


# DirectoryIndex index.php /index.php
AddDefaultCharset UTF-8
RewriteEngine on
# Options All
# Options +FollowSymLinks
# Options +FollowSymLinks -Indexes -ExecCGI
# RewriteBase /

#####################################################

<IfModule mod_headers.c>
    ExpiresActive On
    ExpiresDefault M172800
    Header unset ETag
    FileETag None
    Header unset Pragma

    ##### STATIC FILES
    <FilesMatch "\\.(ico|jpg|png|gif|svg|swf|css|js|fon|ttf|eot|xml|pdf|flv)$">
        ExpiresDefault M1209600
        Header set Cache-Control "public, max-age=1209600"
    </FilesMatch>

    ##### DYNAMIC PAGES
    <FilesMatch "\\.(php)$">
        ExpiresDefault M604800
        Header set Cache-Control "public, max-age=604800"
    </FilesMatch>
</IfModule>

#####################################################

#  /page123 and /page123/ will all go to /page123.php
RewriteRule ^(.+)/$  /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

####################################################

# NO WWW   http://www. becomes always http://
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

##############################################################
# add own extensions that will be interpreted as php
AddType application/x-httpd-php .php
AddType image/svg+xml svg svgz
AddType text/css css
AddType text/javascript js
AddEncoding gzip svgz

##############################################################

ErrorDocument 500 /
ErrorDocument 404 /

Відповіді:


10

Ну, .htaccess файли використовують той же формат, що і звичайний файл конфігурації Apache, тому застосовуються ті самі правила.

Більшість параметрів конфігурації не залежать від порядку, але деякі - залежать від налаштування.

RewriteRuleі, RewriteCondнаприклад, чутливі до порядку, тож у такому випадку відповідь ТАК.

Див. Напр

http://wiki.apache.org/httpd/RewriteRule

для пояснення порядку, який оцінюється.


4

Це має значення. Цитуючи з документації для RewriteRule :

Порядок, в якому визначені ці правила, є важливим - це порядок, в якому вони будуть застосовуватися під час виконання.


1
Всередині mod_rewrite важливо - так. Однак ОП не стосується конкретно mod_rewrite, і у .htaccessфайлі ОП є багато інших директив інших модулів . Коротше кажучи, директиви з різних модулів (і в різних контейнерах ) виконуються незалежно і в заздалегідь визначеному порядку, незалежно від їх очевидного порядку в конфігураційному файлі.
MrWhite

1

Я не можу говорити про те, як порядок <files>vs <Rewrite>, наприклад, впливає на продуктивність. Я намагаюся це дізнатися сам. Я не зміг знайти будь-яку інформацію про це, так що, можливо, це не має значення ??

Тим НЕ менше, я хотів би зазначити, що між Rewriteпроти RedirectRedirectMatch), порядок виконання може не бути зазначеному порядку, хоча це часто то , що люди можуть очікувати .. В
зокрема, mod_rewriteі mod_aliasмодулі обробляються / виконуються independantly, і в той наказ.

  1. Всі директиви mod_rewrite ( Rewrite) виконуються (у порядку їх переліку).
  2. ТОДІ всі директиви mod_alias ( Redirectа RedirectMatch) виконуються в тому порядку , вони перераховані у файлі.

Отже, навіть якщо Redirectвиручка a Rewrite, Переспрямування буде оброблено лише після того , як будуть оброблені всі Rewrites.

Один із способів зберегти файл "читабельним", якщо ви маєте і перенаправлення, і переписування, - це не використовувати mod_aliasмодуль взагалі. Натомість використовуйте лише mod_rewrite. Перепишіть прапором [R] по суті перетворює його на перезапис.
Відповідь цього веб-майстра показує, як.

Тепер усі директиви будуть виконуватись у тому порядку, який вони відображаються у файлі, тож не виникає неприємних сюрпризів чи плутанини щодо порядку виконання. Крім того, ви можете фізично перенести всі директиви Redirectта RedirectMatchдирективи в "нижню частину" файлу, щоб нагадати собі, що вони все одно не будуть виконуватись після закінчення Rewrites.

Ось кілька хороших відповідей StackExchange, які прозріли до цього моменту:

Щодо решти, я, наприклад, не змогла знайти інформацію про продуктивність між розміщенням filesдо або після rewrites, наприклад. Єдиний виступ на основі рада , який я знайшов, що якщо один має доступ до файлів конфігурації сервера, то краще рухатися якомога більше з файлу .htaccess в файлі конфігурації, і відключити файли .htaccess в цілому (або вказати конкретні каталоги , в яких .htaccess файли слід читати).

Логіка полягає в тому, що правила, розміщені у конфігураційному файлі, потрібно прочитати лише один раз. Якщо ввімкнено обробку htaccess, то для кожного запиту необхідно шукати кожен каталог сервера (на або вище, ніж запитуваний каталог) для можливих файлів htaccess, незалежно від того, існують вони чи ні. А якщо так, то кожного треба прочитати заново.

  • apache docs згадує це внизу розділу ".htaccess файли", але не пояснює, чому, і вам доведеться копатися, щоб дізнатися, як.
  • http://www.apacheweek.com/features/tips "Як пришвидшити розділ Apache" наочно демонструє, чому в швидкому порядку.
  • Продуктивність Apache: вимкнути .htaccess - спершу вниз прочитати розділ "Відключення .htaccess та використання mod_rewrite в межах конфігурації Apache".

-1

У мене таке ж занепокоєння розміщене, але це перспектива сайту адміністратора сервера, яка дозволяє їм перезапустити apache після зміни конфігурації сервера apache.

Поки найкраща відповідь, яку я отримав, - це спочатку перелічити пов'язані з файлами директиви.

Це має сенс, пов’язаний з необхідністю apache керувати каталогами та інструкціями htaccess у кожному каталозі.

Отже, перерахуйте спочатку директиви, пов'язані з файлами, а потім очевидні блоки, щоб закінчити процес apache htaccess в порядку очевидного.

Можливе рішення для оптимізації запитів: - виправлення, пов’язані з URL-адресою, - обмеження, пов’язані з каталогом, - обмеження, пов’язані з індексом, - обмеження щодо файлів - обмеження проксі-сервісу <- вбити всіх - порожній агент користувача <- вбити всіх ... список нескінченно цікавий

Моє занепокоєння стосувалося послідовності директив. Наприклад, чи слід встановлювати директиви Index, file та Header перед RewriteConds?


виноска: Заміна шаблону RewriteRule [прапори] не відповідає на це очевидне запитання щодо обробки додатків!
Testbench
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.