Я выдаю 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-адреса и, наконец, отправляет пользователя на нужную страницу. Если это что-то вроде поиска в базе данных, пользователю может потребоваться много времени, чтобы на самом деле перейти на нужную страницу …
Любые указатели на это, пожалуйста?
Нет, это не нормально и будет мешать вашей скорости загрузки страницы.
Файлы .htaccess оцениваются при каждом запросе сервера. Даже для статических изображений, CSS и JS-файлов. Итак, вы просите веб-сервер анализировать 1000 + длинные строки REGEX при выполнении запроса.
Кроме того, файл .htaccess родительского каталога обрабатывается также для файлов, находящихся в подкаталоге. Итак, если ваш большой .htaccess находится в корневом каталоге веб-сайта, он будет обработан для всех запросов, сделанных для файлов в подкаталогах (вместе с файлом .htaccess в подкаталоге).
То, что мой друг много обрабатывает. Если у вас есть страница с 10 изображениями (например), она обрабатывает 11 раз. И чем больше обработка в файле, тем больше циклов требуется. Так что да, все в файле htaccess имеет влияние. Теперь это влияние заметно? Трудно сказать, когда это станет проблемой. Но это должно быть довольно большим, как обработка в относительно простой, что в вашем случае.
Ключ с файлом htaccess – сделать его умным. Вы не хотите перечислять 200 записей. Вы можете сделать это умным только с несколькими строками (если вы хотите использовать htaccess).
Я бы выполнил простой тест: сгенерировал большой файл .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())
Наличие таких правил действительно нецелесообразно. Дело не в том, что они находятся в файле .htaccess или что они протестированы для каждого запроса. (В зависимости от конфигурации это также может произойти, если вы поместите их в конфигурацию вашего сервера или виртуального хоста).
Дело в том, что проверяется огромное количество правил и, в зависимости от правил, каждое правило должно быть проверено до тех пор, пока не будет найдено совпадение.
Ну, вы могли бы противодействовать этому, упорядочив правила в порядке совпадения вероятности, чтобы вероятность поиска матча была высокой. Но сложность по-прежнему O (n) в худшем случае.
Если вам действительно нужны такие сопоставления и сопоставления фиксированы, вы можете использовать хеш-файл RewriteMap
который имеет сложность O (1) вместо O (n) для разделенных правил. Или вы переносите сопоставление на свое приложение PHP и делаете его там.
Это должно быть хорошо. Вы просто можете столкнуться с задержкой сервера, когда он станет очень длинным. Я бы рассмотрел спецификации mod_rewrite, вы могли бы автоматизировать форварды с помощью нескольких функций line & regex. Я не знаю достаточно о переменных URL, которые будут переданы, чтобы дать вам пример.
Это определенно не все в порядке, о чем говорили несколько человек.
Знаете ли вы все URL-адреса, которые вы хотите переписать заранее. Если это так, вы можете хранить правила в некоторой базе данных, перебирать правила и предварительно генерировать фактические URL-адреса и хранить их в memcache, при этом ключ является красивым URL-адресом и значением, являющимся фактическим URL-адресом контента.
Затем, когда приходит запрос, найдите ключ в memcache и перенаправьте пользователя на реальный URL. Я даже не думаю, что вам нужно .htaccess для этого.