Как использовать apache mod_rewrite и alias одновременно? - PullRequest
16 голосов
/ 02 декабря 2008

У меня есть каталог вне webroot, который используется для хранения изображений, загруженных из отдельной системы администратора. Изображения хранятся в этом формате:

filepath/writable/images/00/00/23/65/filename-236581.jpg

(где webroot - filepath / html)

... например. Здесь 236 - это идентификатор изображения в базе данных, а файловая система разбита на пронумерованные каталоги, чтобы не использовать более 100 inode в одном каталоге.

Я хочу иметь доступ к ним через интерфейсный веб-сервер, например:

http://(server)/filename-236581.jpg

Где filename - оптимизированная для SEO строка, такая же, как и в названии фактического файла.

Я могу заставить mod-rewrite перезаписать URL, чтобы он содержал дополнительные пронумерованные каталоги, и я могу получить псевдоним, чтобы перенаправить запрос в каталог writable / images, но я не могу сделать оба одновременно. Если я добавлю обе директивы alias и mod_rewrite, он игнорирует псевдоним и журнал ошибок сообщит, что не может найти filepath / html / uploaded-images.

Вот что у меня есть:

RewriteRule ^(.*)\/([^\/]*)-([0-9])\.(gif|jpg|jpeg|png)$ /uploaded-images/00/00/00/00/$2-$3.$4 [L,NC]

... и так далее, вплоть до:

RewriteRule ^(.*)\/([^\/]*)-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])\.(gif|jpg|jpeg|png)$ /uploaded-images/$3$4/$5$6/$7$8/$9$10/$2-$3$4$5$6$7$8$9$10$11$12.$13 [L,NC]

alias /uploaded-images "filepath/writable/images"

Удаление [L] не имеет значения.

Ответы [ 2 ]

18 голосов
/ 02 декабря 2008

[L] означает последний.

Что вам действительно нужно использовать, так это флаг [PT], указывающий, что результирующий путь из вашего правила перезаписи должен быть передан следующему обработчику, который в вашем случае является директивой псевдонима.

Поскольку тег [PT] также подразумевает тег [L], который вам больше не требуется, [L] также.

1 голос
/ 02 декабря 2008

То, что [L] у вас есть после RewriteRule, означает «последний»

Если честно, я полагал, что это только означало, что дальнейшие строки RewriteRule будут игнорироваться, но, возможно, стоит проверить.

...