Easy mod_rewrite - так что мне больше никогда не придется об этом думать - PullRequest
2 голосов
/ 22 декабря 2009

Не знаю, как вы ответите на этот вопрос, но ...

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

Итак, я хочу создать метод, который в конце концов достиг бы чего-то вроде ...

index.php?do=user&username=MyUsername //This becomes...
/user/MyUsername //...that
index.php?do=page&pagename=customPage //And this becomes...
/page/customPage //...that
index.php?do=lots&where=happens&this=here //This also becomes...
/lots/happens/here //...that
index.php?do=this&and=that&that=this&and=some&more=too //And yes...
/this/that/this/some/more //This becomes this

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

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Вы можете использовать другой подход - добавить URL-адрес в один параметр и проанализировать его в своем приложении.

Таким образом, правило переписывания apache будет выглядеть так:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

, который преобразует ваши URL следующим образом:

/user/MyUsername => index.php?q=/user/MyUsername
/page/customPage => index.php?q=/page/customPage
...

В вашем приложении у вас есть переменная $ _GET ['q'], которую вы можете разделить на '/', и ваши аргументы будут в порядке. В PHP это было бы что-то вроде:

$args = explode('/', $_GET['q']);

$ args будет массивом с 'user', 'MyUserName' и т. Д.

Таким образом, вам больше не придется прикасаться к вашему .htaccess, просто к логике вашего приложения.

1 голос
/ 22 декабря 2009

Для /user/MyUsername ==> index.php?do=user&username=MyUsername и /page/customPage ==> index.php?do=page&pagename=customPage, вы можете использовать:

RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)$ index.php?do=$1&$1name=$2 [L]

Но я не думаю, что вы можете написать универсальное правило для /lots/happens/here и /this/that/this/some/more, потому что вам нужно указать mod_rewrite, как переводить эти два URL.

Помните, mod_rewrite должен переводить /lots/happens/here в index.php?do=lots&where=happens&this=here, а не наоборот.

0 голосов
/ 22 декабря 2009

Лучшим подходом было бы делегировать приложению генерировать «красивые URL», а также анализировать и интерпретировать их и использовать mod_rewrite только для перезаписи запросов к вашему приложению с помощью правила, подобного этому:

RewriteRule %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Это правило переписывает все запросы, которые не могут быть сопоставлены напрямую с существующим файлом, в index.php . Первоначально запрошенный URL-адрес (точнее: путь URL-адреса плюс запрос) будет доступен по адресу $_SERVER['REQUEST_URI'].

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