Apache не переписывает запрос, если файл по пути существует - PullRequest
2 голосов
/ 20 сентября 2011

Я делаю перезапись с mod_rewrite при каждом запросе, который не соответствует существующему файлу или каталогу. Это моя конфигурация:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]

Используется для сопоставления URL-адресов, таких как /abc/foo или /abc/foo/10, с моим приложением. И это работает просто отлично.

Для повышения производительности мое приложение теперь сохраняет результаты вызова /abc/foo в файле foo в соответствующем каталоге /abc - так что после первого вызова условия перезаписи больше не применяются (файл не существует) и Apache напрямую обслуживает данные без предварительного вызова приложения. Хорошо работает.

Проблема в том, что запрос /abc/foo/10 больше не приводит к перезаписи URL, вместо этого я получаю сообщение об ошибке «404 Файл не найден». В записях журнала указывается, что условие перезаписи !-f больше не выполняется, но фактически файл /abc/foo/10 действительно не существует. /abc/foo существует, но это файл, а не каталог.

Как мне заставить это работать?

(MultiViews отключен)

Ответы [ 3 ]

4 голосов
/ 09 мая 2012

Это потому, что foo существует как файл, а apache обслуживает foo с дополнительным / 10, переданным в виде строки запроса. Итак, ваше приложение должно записать некоторый дополнительный код в файл foo, который также проверяет, включает ли запрос какой-либо дополнительный компонент url, а затем обрабатывать создание каталога "foo" и файла 10.

3 голосов
/ 04 мая 2012

Вы должны находиться в контексте per-dir / htaccess с параметром AcceptPathInfo.

Следовательно, REQUEST_FILENAME соответствует существующей части и не совпадает с REQUEST_URI.

Используйте переменную REQUEST_URIесли вам все равно, где запрос был ранее отображен в вашей перезаписи.

В контексте per-vh эти переменные всегда одинаковы.

2 голосов
/ 09 мая 2012

Дизайн проекта немного неправильный - другие уже отмечали, что он не масштабируемый - как вы можете кэшировать запрос в / abc / foo / 10, если файл / abc / foo уже существует?

Ответом на это и Вашей проблемой является использование подпапок вместо файлов.

Таким образом, вместо структуры кэша:

/abc/foo
/abc/bar
 ...?

использование:

/abc/index.html
/abc/foo/index.html
/abc/bar/index.html
/abc/foo/10/index.html

и каждый раз создайте новый каталог с index.html

На этот раз Apache обнаружит, что в папке / abc / foo нет файла / abc / foo / 10, поэтому RewriteCond будет применяться.

редактировать

Вы также можете попробовать другой способ - изменить URL с помощью mod_rewrite, изменив URL:

/abc/foo
/abc/bar
/abc/foo/10

что-то вроде:

/cache/abc~foo
/cache/abc~bar
/cache/abc~foo~10

Правила доступа (примерно):

# redirecting to cache folder and removing last '/'
RewriteCond %{REQUEST_URI} ^/(abc|cde)
RewriteRule ^(.*?)/?$ /cache/$1 [L]

# recursive replacing '/' with '~'
RewriteCond %{REQUEST_URI} ^/cache/.*/
RewriteRule cache/(.*)/(.*)$ /cache/$1~$2 [L]

Ваши стандартные правила htaccess должны соответствовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...