Можно ли иметь очень длинный файл .htaccess? - PullRequest
9 голосов
/ 14 декабря 2010

Я даю URL-адреса людям на веб-сайте, которые на самом деле указывают на что-то некрасивое (на том же веб-сайте).

http://www.mydomain.com/cool-URL
фактически указывает на
http://www.mydomain.com/boring.php?id=478547&sessid=34734asdf7&otherboringdetails

Я планирую добиться этого, изменяя файл .htaccess при необходимости. Я собираюсь заставить PHP-скрипт писать в файл .htaccess, добавляя новое правило перезаписи всякий раз, когда появляется новый раздаточный материал URL-адреса (из области администрирования может управлять не программист [укажите для этого заголовок URL-адреса) новая запись, admin: она будет назначена автоматически]).

Это будет проблемой, особенно после 1000 или около того таких URL? Какой фактический номер является приемлемым? Потому что я могу изобразить это: сервер получает запрос на URL, затем он ищет в файле .htaccess нужную страницу для этого URL и, наконец, отправляет пользователя на нужную страницу. Если это что-то вроде поиска в базе данных, пользователю может потребоваться много времени, чтобы на самом деле добраться до нужной страницы ...

Есть какие-нибудь указатели на это, пожалуйста?

Ответы [ 5 ]

19 голосов
/ 14 декабря 2010

Нет, это не нормально и будет препятствовать скорости загрузки страницы.

.htaccess файлы оцениваются по КАЖДОМУ запросу сервера. Даже для статических изображений, файлов CSS и JS. Итак, вы просите веб-сервер проанализировать 1000+ длинных строк REGEX при выполнении запроса.

Кроме того, файл .htaccess родительского каталога обрабатывается и для файлов, находящихся в подкаталоге. Итак, если ваш большой .htaccess находится в корневом каталоге веб-сайта, он будет обрабатываться для всех запросов, сделанных для файлов в подкаталогах (вместе с файлом .htaccess в подкаталоге).

То, что мой друг много обрабатывает. Если у вас есть страница с 10 изображениями (например), она обрабатывается 11 раз. И чем больше обработки в файле, тем больше циклов. Так что да, что-либо в файле htaccess оказывает влияние. Теперь это влияние заметно? Трудно сказать, когда это становится проблемой. Но это должно быть довольно большим, так как обработка в относительно простой, что в вашем случае.

Ключ к файлу htaccess - сделать его умным. Вы не хотели бы перечислить 200 записей. Вы можете сделать это с помощью всего лишь нескольких строк (если вы хотите использовать htaccess).

5 голосов
/ 14 декабря 2010

Наличие такого количества правил действительно нежелательно.Дело не в том, что они находятся в файле .htaccess или что они проверяются для каждого запроса.(В зависимости от конфигурации это также может произойти, если вы поместите их в конфигурацию вашего сервера или виртуального хоста.)

Это просто тот факт, что тестируется огромное количество правил и, в зависимости от правил,каждое правило должно проверяться до тех пор, пока не будет найдено совпадение.

Что ж, вы можете противодействовать этому, расположив правила в порядке вероятности совпадения, чтобы вероятность раннего совпадения была высокой.Но его сложность все еще равна O (n) в худшем случае.

Если вам действительно нужно столько сопоставлений и сопоставления исправлены, вы можете использовать RewriteMap хеш-файл , которыйсложность O (1) вместо O (n) для разделенных правил.Или вы переносите отображение в свое PHP-приложение и делаете это там.

5 голосов
/ 14 декабря 2010

Я бы выполнил простой тест: сгенерировал большой файл .htaccess со случайными URL-адресами и сам измерил бы результат.

import random,string

def rand_string():
    length = random.randint(4,10)
    res = []
    for i in range(length):
        res.append(random.choice(string.letters))
    return ''.join(res)

for i in range(1000):
    print "RewriteRule %s http://www.mydomain.com/boring.php?%s [R]" % \
     (rand_string(), rand_string())
1 голос
/ 25 марта 2011

Это определенно не в порядке, как уже упоминали несколько человек.

Знаете ли вы все URL, которые вы хотите переписать заранее.Если это так, вы можете сохранить правила в некоторой базе данных, выполнить итерации по правилам и предварительно сгенерировать фактические URL-адреса, и сохранить их в memcache, причем ключ - это красивый URL, а значение - фактический URL-адрес содержимого.*

Затем, когда приходит запрос, найдите ключ в memcache и перенаправьте пользователя на реальный URL.Я даже не думаю, что вам нужен .htaccess для этого.

1 голос
/ 14 декабря 2010

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

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