Если вы хотите, чтобы /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
в bar
(и RewriteBase
не задано), то 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-адресах как об абстракции, отдельной от путей вашей файловой системы.Но это опасная, глупая вещь.