.htaccess и $ _GET переписать - PullRequest
0 голосов
/ 12 июля 2009

У меня раздражающая проблема. У меня есть скрипт, который использует функцию $ _GET php, чтобы получить переменную из URL-адреса страницы. Однако мне нужно знать, как, прежде всего, сделать так, чтобы URL моей страницы шел с

http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse

до

http://www.example.com/something/dir2/somethingelse/page.php

Это сбивает меня с толку.

Теперь вот сложная часть: как мне $ _GET получить значения value и anothervalue, оставив при этом другие значения url в конце page.php без изменений? Также, если пользователь посещает http://www.example.com/something/dir2/somethingelse/page.php, ему будет показан контент для http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse, и наоборот, верно?

Это очень важно для работы моего сайта, спасибо за помощь заранее! Я ничего не знаю о .htaccess, но знаю, что это возможно.

Чтобы пояснить, выполнение этой очень запутанной вещи в действительности значительно упростит задачу, поскольку потребует гораздо меньше перекодирования и обеспечит более чистые URL-адреса.

Ответы [ 3 ]

2 голосов
/ 12 июля 2009

Это правило должно делать это:

RewriteCond %{REQUEST_URI} !^/dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*) dir/$2/$4?value=$1&anothervalue=$3 [L,QSA]

Внутренние запросы /something/dir2/somethingelse/page.php будут переписаны на /dir/dir2/page.php?value=something&anothervalue=somethingelse.

Но это не помешает запросить последнее напрямую, а только разрешить псевдоним.

Перенаправление запросов /dir/dir2/page.php?value=something&anothervalue=somethingelse извне на /something/dir2/somethingelse/page.php также возможно с mod_rewrite, но требует немного более сложного правила, поскольку параметры URL могут иметь произвольный порядок:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)value=([^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^([^&]+)&(([^&]*&)*)anothervalue=([^&]+)&?([^&].*)?$
RewriteRule ^dir/([^/]+)/(.*) /%1/$1/%4/$2?%2%5 [L,R=301]

Как видите, это не очень приятно. Лучшим решением будет проверить с помощью PHP, какой URL был запрошен (см. $_SERVER['REQUEST_URI']) и выполнить перенаправление с помощью PHP (см. header function ).

2 голосов
/ 12 июля 2009

Вы правы, это возможно сделать. Другие могут не согласиться, но я склонен думать, что в данный момент вы должны обратиться к документации для mod_rewrite . Если вы собираетесь поддерживать этот комплекс переписываний, вам нужно будет рано или поздно узнать об этом, так что это может произойти и сейчас.

1 голос
/ 12 июля 2009

Для конкретной перезаписи, которую вы представляете выше, должно работать что-то вроде этого:

RewriteEngine On
RewriteRule ^/(.*)/(.*)/(.*)/(.*)\.php$ /dir/\2/\4.php?value=\1&anothervalue=\3 [L]

... хотя на практике я бы не рекомендовал использовать точечный токен, как показано, так как он будет сопоставлять пути с дополнительными уровнями в них и испортить перезапись. Замена каждой точки на [^/] может сработать, хотя я хотел бы, чтобы кто-то, кто лучше в регулярных выражениях, чем я, посмотрел и определил, есть ли здесь какие-то подводные камни. В любом случае, важным моментом является то, что регулярные выражения могут быть как очень сложными, так и очень мощными, и полное их объяснение выходит далеко за рамки этого ответа. Попробуйте потратить некоторое время на http://www.regular -expressions.info для общего учебника.

Кроме того, если пользователь посещает http://www.example.com/something/dir2/somethingelse/page.php, ему будет показан контент для http://www.example.com/dir/dir2/page.php?value=something&anothervalue=somethingelse и наоборот, верно?

Нет; это работает только в одну сторону. Чтобы сделать это обоими способами, вам понадобятся два RewriteRules.

Я не уверен, что понимаю ваш вопрос о $ _GET. $ _GET - это массив, который заполнен парами ключ / значение для каждого из параметров в URL; Вы можете использовать их столько, сколько захотите. Это не разрушительно - его использование не изменяет параметры строки URL.

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