Как переписать эти URL для страны, штата, города? - PullRequest
0 голосов
/ 29 января 2012

У меня есть сайт, на котором статьи отправляются со всего мира, и я записываю их местоположение как Country -> State -> City, для этого я генерирую URL-адреса, такие как:

site/location/countryname/statename/cityname

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

PS: он не должен передавать пустые значения, если кто-то удаляет имя или имя страны, значит, URL может быть:

site/location/countryname
site/location/countryname/statename
site/location/countryname/statename/cityname

Но не может быть:

site/location//statename/cityname
site/location/countryname//cityname

В приведенных выше URL-адресах, если имя страны удалено, тогда statename не должно рассматриваться как название страны. Имя файла для чтения location.php

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 января 2012
  • Прежде всего убедитесь, что между каждой косой чертой нет (/). Это ([^/]*).
  • Тогда убедитесь, что оно никогда пусто. Это + вместо *. Итак, теперь это ([^/]+).
  • Затем немедленно остановите правило, как только оно будет проверено: используйте директиву L.
  • Не забудьте заставить строку запроса следовать через директиву QSA.

Вот ваши окончательные правила:

RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3&statename=$4&cityname=$5 [QSA,L]
RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3&statename=$4 [QSA,L]
RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3 [QSA,L]

А если этого недостаточно:

Два совета:

Если вы не в размещенной среде (= если это ваш собственный сервер и , вы можете изменить виртуальные хосты (не только файлы .htaccess), попробуйте использовать директиву RewriteLog: она поможет вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьте выбрать ereg (POSIX) вместо preg (PCRE)!)

0 голосов
/ 31 января 2012

Хорошо, у меня есть способ сделать это:

RewriteRule ^bylocation/([-a-z_]+)(?:/([-a-z_]+)(?:/([-a-z_]+))?)?/?$ location.php?country=$1&state=$2&city=$3 [NC,L,QSA]

Это одно правило может заботиться вместо трех правил.

0 голосов
/ 29 января 2012

Попытайтесь написать правила, где более длинное условие на первом месте -

RewriteRule ^page/(.*)/(.*)/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3&statename=$4&cityname=$5 [QSA]
RewriteRule ^page/(.*)/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3&statename=$4 [QSA]
RewriteRule ^page/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3 [QSA]
...