Url Mod-Rewrite Получить новую страницу с идентификатором - PullRequest
0 голосов
/ 12 марта 2012

Мне нужна помощь экспертов.

У меня есть несколько правил переписывания:

post.php go to http://example.com/post/3/
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L]

Это работает!

Но как я могу добавить новое правило перезаписи на новую страницу Users.php после записи / ID / И получите идентификатор в Users.php (Users.php? Id = 3)

Как это http://example.com/post/3/users

Спасибо!

1 Ответ

3 голосов
/ 12 марта 2012

Если вы хотите, чтобы /post/3/users/ перешел на /Users.php?id=3, вы должны поставить это правило перед существующим правилом.Ваше существующее правило соответствует /post/3/', что является префиксом того, что соответствует этому дополнительному правилу, так что правило никогда не сработает, если оно после.

# catch the longer URL first
RewriteRule ^post/([A-Za-z0-9-]+)/users/?$ Users.php?id=$1 [NC,L]

# No /users/ on it; rewrite to post.php
RewriteRule ^post/([A-Za-z0-9-]+)/?$ post.php?id=$1 [NC,L]

Еще одна вещь: вы пометили свой пост .htaccess.Означает ли это, что вы переписываете в .htaccess?Если это так, вы должны использовать RewriteBase, потому что ваши изменения являются относительными.Почему это работает, вероятно, вы разрешаете соответствие 1: 1 между путями и URL-адресами на вашем веб-сервере.

В контексте каждого каталога, таком как .htaccess, mod_rewrite работает с именами путей, а не URL-адресами.Но если вы сделаете относительную перезапись, путь преобразуется в URL и возвращается в цепочку обработки запросов Apache для повторной обработки.Как путь превращается в URL, так это то, что содержимое RewriteBase добавляется вперед.Если у вас нет RewriteBase, тогда случается глупая вещь: путь к вашему каталогу (который был удален для RewriteRule, только что добавлен!).

Пример: предположим, ваш DocumentRoot равен /var/www.Предположим, браузер запрашивает URL /foo.Это преобразуется в путь /var/www/foo Если внутри .htaccess для /var/www/ вы переписываете foo в barRewriteBase не задано), то mod_rewrite сгенерирует URL /var/www/bar: это простоберет каталог /var/www/, который был удален, и помещает его обратно.Теперь это можно заставить работать: просто сделайте /var/www/ действительным URL-адресом для этого каталога.Например, с

Alias /var/www /var/www # map /var/www URL to /var/www directory

Но это глупо.Правильный путь - иметь RewriteBase / в .htaccess.Поэтому, когда foo переписывается в bar, он просто получает / впереди и становится URL /bar.Это передается обратно на сервер и снова «естественно» разрешается обратно в корень документа.

Я использовал подобные хаки, прежде чем понял переписывание.Я даже использовал / как DocumentRoot!Это заставило все работать с тех пор, что большинство URL-адресов являются путями: вам не нужно думать об URL-адресах как об абстракции, отдельной от путей вашей файловой системы.Но это опасная, глупая вещь.

...