Що таке еквівалент Apache з_пробних файлів Nginx?


12

У Nginx є try_filesконфігураційна директива, яка "перевіряє наявність файлів у порядку і повертає перший знайдений файл". Я вважаю, що це дуже акуратно робити

location ~* \.(gif|jpe?g|css|js)$ {
    try_files $uri 404;
}

Це безпечний спосіб прямого обслуговування статичних файлів, не турбуючи веб-рамки. Як я можу зробити те саме в Apache?


1
Яке рішення ви вирішили? Обрана відповідь насправді не відповідає моєму використанню.
панепетер

Відповіді:


9

Я зазвичай бачу, що це робиться з mod_rewrite:

 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
 RewriteRule ^/(.*)$ balancer://app_cluster%{REQUEST_URI} [P,QSA,L]

Це означає: "Якщо файлу у файловій системі не існує, проксі проксі через мій кластер mod_proxy_balancer." В іншому випадку, якщо файл існує у файловій системі, він просто обслуговується Apache щодо визначеного DocumentRootу вашому virtualhost.

Але це не мій улюблений спосіб, здебільшого тому, що він вимагатиме statсистемного дзвінка за запитом.

З mod_proxy ви можете користуватися, ProxyPassMatchякщо у вас є достатньо нова версія Apache ( див. Документацію ). Як от:

ProxyPassMatch \.(gif|jpe?g|css|js)$ !

Який використовує! щоб вказувати Apache, не слід прокси-запити, що відповідають цьому регулярному виразу

Якщо ви використовуєте старішу версію Apache, у вас буде ProxyPassдоступна директива, але вона відповідає лише префіксам URI (це мій поточний бажаний метод):

ProxyPass /images !
ProxyPass /stylesheets !

Звичайно, якщо вам потрібно регулярно співставити вирази, як ви згадували вище, ви можете просто змінити правило mod_rewrite, яке я розмістив у верхній частині, щоб зняти відповідність проти %{REQUEST_URI}.

Сподіваюся, що це допомагає!


2
Я думаю, що "поганий" спосіб схожий на те try_files, що він перевіряє наявність файлу. Здається, не існує способу це зробити, ProxyPassхоча.
phunehehe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.