Скрытие параметров ключа URL с помощью .htaccess - PullRequest
2 голосов
/ 21 июля 2011

Я искал по всей сети и пока не нашел решения этой проблемы. Я надеюсь, что вы могли бы пролить свет на ситуацию.

У меня файл индекса настроен так:

<header></header>
<div id="main">
    <?php
    if(isset($_GET["p"])) $p = $_GET["p"];
    else $p = "home";

    if(file_exists("pages/{$p}.php")) include("pages/{$p}.php");
    ?>
</div>

, что заставляет меня загружать мои страницы с ?p=contact href.

Скажите, что я хотел бы отобразить профиль пользователя. Затем я бы создал подпапку в моей папке "pages", указав относительный путь pages/users/profile.php, то есть href ?p=users/profile&uid=5. Но это оставляет уродливый URL (а также рейтинг SEO).

Как бы я переписал этот URL, чтобы он выглядел как /users/profile/5?


EDIT: Я пробовал следующее, в результате чего HTTP 500:

RewriteRule ^([^/]*)/([^/]*)$ /?p=$1&uid=$2 [L]

РЕДАКТИРОВАТЬ: Мой файл .htaccess, расположенный непосредственно в корневой папке: http://pastie.org/2268239
Строка 338 - это то, где я хочу достичь этого (в настоящее время это просто комментарий).

Ответы [ 3 ]

2 голосов
/ 20 апреля 2013

Я достиг желаемого эффекта, добавив эти три строки:

RewriteRule ^([a-zA-Z]+)$ index.php?p=$1 [L]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?p=$1/$2 [L]
RewriteRule ^([a-zA-Z]+)/([0-9]+)$ index.php?p=$1&uid=$2 [L]

Это позволяет мне получить доступ к /contact, /users/index и /users/profile/5.

2 голосов
/ 21 июля 2011

Самый простой ответ для обеих ваших ситуаций - добавить это в ваш файл .htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php?$1 [L]

Это перенаправит весь трафик вашего домена в ваш файл index.php.

Затем вы можете определить, что делать в вашем скрипте, используя uri в $ _SERVER ["REQUEST_URI"]

1 голос
/ 25 июля 2011

Я не php парень, но я попробовал это переписать.

RewriteRule ^/(.+)/([^/]+)$ /index.php?p=$1&uid=$2 [L]

В этом случае для параметра p вы ищете все символы до последнего слэша, поэтому первая часть этого требует ничего, в противном случае остановится на первом слэше (пользователи вместо пользователей /profile).

Затем он ищет слеш и сохраняет (не слэш). (.+) будет жадным, поэтому до конца будет идти до последней косой черты.

Тогда мне пришло в голову, что последняя часть не должна избегать косых черт. Поскольку первая часть является жадной, явная косая черта / будет последней. Так что это еще проще:

RewriteRule ^/(.+)/(.+)$ /index.php?p=$1&uid=$2 [L]

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

Эти правила предполагают, что все URL будут в этом формате, о чем вы и просите. Но, возможно, это слишком чересчур, поэтому он может исключить URL, которые действительно имеют .htm, .php или что-то еще.

RewriteRule ^/(.+)/([^.]+)$ /index.php?p=$1&uid=$2 [L]

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

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