2016-08-12 16 views
2

В настоящее время у меня возникли проблемы с настройкой правил (ов) перезаписи в файле .htaccess для сервера Apache 2.2 с mod_rewrite. Вот общая идея того, что я хочу сделать:apache mod_rewrite: Как добавить разные правила перезаписи для того же каталога в зависимости от существования файла в другом каталоге?

Предположим, что домен сервера example.com/, и все запросы example.com/abc/ и пути ниже этого каталога должны быть перезаписаны. Есть два сценария:

  1. прошу непосредственно example.com/abc/ или example.com/abc/index.php должны стать просьбами example.com/index.php с дополнительным параметром, чтобы указать оригинал каталог запроса. Приведем несколько примеров:

    • example.com/abc/ ==>example.com/abc/index.php?directory=abc
    • example.com/abc/?foo=1&bar=2 ==>example.com/abc/index.php?directory=abc&foo=1&bar=2
    • example.com/abc/?a=b&c=d ==>example.com/abc/index.php?directory=abc&a=b&c=d
    • ... и так далее
  2. просит к файлам в example.com/abc/ должны появляться запросы к файлам в example.com/, если эти файлы существуют. для указания текущего каталога. Приведем несколько примеров:

    • example.com/abc/image.png ==>example.com/image.png (если позже файл существует)
    • example.com/abc/sub/file.css ==>example.com/sub/file.css (если позже файл существует)
    • example.com/abc/foo/bar/baz/name.js ==>example.com/foo/bar/baz/name.js (если более поздний файл есть)
    • ... и прочее.

Содержание моей .htaccess в настоящее время выглядит примерно так:

RewriteEngine on 
Options FollowSymLinks 
RewriteBase/

# rule for files in abc/: map to files in root directory 
RewriteCond $1 -f 
RewriteRule ^abc/(.*?)$ $1 

# rule for abc/index.php: map to index.php?directory=abc&... 
RewriteCond $1 !-f 
RewriteRule ^abc/(.*?)$ index.php?directory=abc&$1 [QSA] 

Поздний правило, кажется, работает, запросы example.com/abc/index.php получить переписаны, как предполагалось , Однако это не работает для файлов в каталоге abc /. Любые подсказки о том, что я делаю неправильно здесь, и как решить эту проблему, оцениваются. Какие изменения должны быть применены к .htaccess, чтобы получить работу, как описано?

ответ

0

Я нашел рабочее решение:

RewriteEngine on 
Options FollowSymLinks 
RewriteBase/

# rule for file in abc/: map them to files in document root 
RewriteCond %{DOCUMENT_ROOT}/$1 -f 
RewriteRule ^abc/(.*?)$ %{DOCUMENT_ROOT}/$1 [L] 

# rule for abc/index.php: map to index.php?directory=abc&... 
RewriteRule ^abc/(.*?)$ %{DOCUMENT_ROOT}/index.php?directory=abc&$1 [QSA,L] 

Два основных отличия:

  • с помощью [L] флаг, чтобы указать, что никакие правила не должны рассматриваться после того, как правило, совпадает с - Вероятно, это была проблема, почему работало только последнее правило.
  • предустановленные местоположения в состоянии и место перезаписи с% {DOCUMENT_ROOT}, чтобы получить абсолютные пути.

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

  • Нет связанных вопросов^_^