PHP: Разбор различных стилей дружественных URL - PullRequest
0 голосов
/ 13 января 2010

Я пишу свой собственный небольшой фреймворк и собираюсь реализовать там дружественные URL. mod_rewrite отлично. Но я хочу иметь возможность обрабатывать несколько типов дружественных URL-адресов одновременно:

/index.php?ac=user&an=showprofile (fallback variant, the worst)
/index.php/user/showprofile (supposedly, can be disabled by security settings)
index.php?user/showprofile (optional, not needed)
/user/showprofile (ideal, but requires mod_rewrite or dirty ErrorDocument tricks)

Я бы хотел, чтобы все варианты поддерживались одновременно, чтобы старые ссылки, созданные по любой схеме, были всегда действительны. Должен ли я написать свои собственные функции разбора для этого или, может быть, я пропустил какую-то библиотеку / скрипт, который может это сделать? Извлечение алгоритмов из больших фреймворков, таких как Symfony или Zend, довольно сложно. Существует также много неочевидных случаев, таких как правильная обработка URL-адресов в кодировке UTF-8 или с помощью magic_quotes_runtime и т. Д.

Ответы [ 3 ]

1 голос
/ 13 января 2010

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

У меня обычно есть один индексный файл, который анализирует любой URL-адрес, а затем выполняет кучу обработки запросов и маршрутизации, чтобы получить выходные данные, без привязки URL-адреса непосредственно к какому-либо файлу. Просто mod_rewrite все в этот индексный файл и анализируйте $_SERVER['REQUEST_URI'].

0 голосов
/ 14 января 2010

Вы должны избегать использования всех типов URL. Если все те URL-адреса, которые вы разместили, показывают одинаковый контент, тогда SE увидят его как дублирующийся контент, и вы в конечном итоге «разделите» свой рейтинг. Другими словами, каждая из четырех страниц будет занимать четверть, а также, если все будет сосредоточено на одном URL-адресе ... если это имеет смысл.

Просто выберите один формат URL, который прост для пользователей, и придерживайтесь его. Лично я предпочел бы последний, с mod_rewrite. Ваш вопрос подразумевает, что с использованием mod_rewrite что-то не так, чего нет.

Вы также можете использовать такие вещи, как $_SERVER["REQUEST_URI"], чтобы определить, какой URL запрашивается, и выполнить перенаправление 301 на официальный URL, если это даже необходимо.

0 голосов
/ 13 января 2010

Первый-третий должен быть передан в PHP для обработки ($_GET, $_SERVER["REQUEST_URI"] и $_SERVER["QUERY_STRING"]).

Четвертый может быть выполнен с помощью mod_rewrite с использованием RewriteCond !-f и соответствующего RewriteRule.

...