2015-01-25 2 views
1

Я искал всюду, пытаясь найти решение того, что я считал особенно распространенной проблемой, но я не могу найти ничего, что сработает.Перенаправление всех запросов на index.php с исключениями

Я использую mod_rewrite для перенаправления всех запросов через мою собственную CMS (index.php). Вот код Htaccess:

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase /blog/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

(выше mod_rewrite точно так же, как код найден в стандартном Wordpress установки, которое почему я недоумевал, как я не могу найти решение следующей задачи)

Я хочу добавить обработку изображений в мои миниатюры. Я написал сценарий php (video-image.php), который отлично работает, но я не могу найти способ перенаправить URL-адреса изображений, сохраняя при этом неизменное перенаправление index.php. Код я ищу что-то делает так:

RewriteRule ^images/video/(.*)/(.*).jpg /images/video/video-image.php?video_image_id=$2&video_image_width=$1 [NC] 

Но приведенный выше код, кажется, вступает в противоречие с mod_rewrite, который посылает свои запросы на index.php. Кажется, я могу либо перенаправить изображения на video-image.php, либо перенаправить свои страницы на index.php, но должен быть способ сделать то и другое?

Я всегда находил mod_rewrite запутанным, так извиняюсь, если я недостаточно объясняю себя. Все скрипты php отлично работают без mod_rewrite, поэтому я уверен, что это не проблема php.

Если кто-то может пролить свет на эту проблему или указать мне на ответ, я бы очень признателен!

+0

Закажите новое правило над существующим блоком RewriteCond/RewriteRule. И вы вообще не хотите, чтобы повсеместно использовался общепринятый RewriteRule *. Будьте более конкретными или используйте [FallbackResource] (http://httpd.apache.org/docs/trunk/rewrite/remapping.html#fallback-resource) вместо этой copypasta. – mario

+0

@mario Man, я просто должен был смеяться над собой. Три часа поиска и попыток, и ответ настолько прост и делает полный смысл ха-ха. Большое спасибо за Вашу помощь! – Lewis

ответ

3

Суть вашей проблемы заключалась в упорядочении блоков перезаписи. Вы обычно ставите более конкретные из общих правил. В вашем случае:

# specific 
RewriteRule ^images/video/(.*)/(.*).jpg /images/… 
# generic 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 

Лучший подход для Apache 2.4, а затем, чтобы использовать FallbackResource вместо RewriteCond/Rule сгустка:

RewriteRule ^images/video/(.*)/(.*).jpg /image 
FallbackResource index.php 

еще две вещи:

<IfModule mod_rewrite.c> 
</IfModule> 

Is то, что вы должны не обычно использовать. Условные директивы имеют смысл в конфигурации ядра Apaches. Для блоков .htaccess RewriteRule это менее целесообразно. Маловероятно, что mod_rewrite случайным образом отключается во время выполнения. И если когда-либо, вы предпочтете ошибки HTTP 500 в вашем журнале, а не пользователи, которые видят результаты 404 Not Found.

Также RewriteBase может сократить некоторые правила или абстрагироваться от их проживания. Но вы также не должны использовать его привычно. Вместо этого просто префикс blog/ соответствует вашим правилам совпадения и собирайте все перезаписи в разделе DOCUMENT_ROOT/.htaccess (или, еще лучше, VirtualHost для производительности).

+0

Еще раз спасибо за вашу помощь @mario Я многому научился из этой публикации.Кажется, метод FallbackResource не работает для меня, поэтому мой хост должен работать с более старой версией apache. Я получил его работу, переупорядочив блоки перезаписи, как вы предложили, но я буду помнить FallbackResource, когда мой хост обходит обновление apache – Lewis

Смежные вопросы