Используя mod_rewrite, как получить последние 3 цифры из URL - PullRequest
0 голосов
/ 23 февраля 2011

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

/ каталог / directory2 / A-B-C-D-123

a, b, c, d и т.д .. может быть любым, цифрами, буквами, но всегда будет иметь тире между

Мы используем кохану для этого проекта, поэтому в игре есть некоторые дополнительные правила переписывания, но это то, что я до сих пор ...

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /site/

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b - [F,L]

#My Code Attempts Here
RewriteCond %{REQUEST_URI} dealership/Listing/                 
RewriteRule ([0-9]*)$ index.php/dealership/Listing/$1     

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

Я пробовал несколько десятков конфигураций, настроек и исследовал Google в течение нескольких часов без конкретных ответов.

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

Конечным результатом будет / directory / directory2 / 123

Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2011

Ваше правило

RewriteRule ([0-9]*)$ index.php/listing/$1

бесполезен, потому что он не меняет REQUEST_URI, поэтому PHP не увидит переписанный index.php/listing/123, он увидит оригинал /listing/foo-123. Если вы добавите флаг [L], он будет зациклен, потому что соответствующий ReqeuestCond останется истинным.

Обычно вы передаете биты URL скрипту в качестве параметров, например

RewriteRule ([0-9]*)$ index.php?listing=$1 [L]

Однако, в этой форме это не будет работать, потому что ([0-9]*)$ соответствует пустой строке в конце любого пути, поэтому это приведет к двум перезаписям:

listing/foo-(123) → index.php?listing=123  # this is what you want ...
index.php()       → index.php?listing=     # ... but it gets rewritten
index.php()       → index.php?listing=     # no change so this is final

Это происходит потому, что все правила перезаписи оцениваются с начала после каждого перезаписи (независимо от флага [L]).

Таким образом, вам нужно более конкретное правило

RewriteRule ^listing/[^/]*-([0-9]*)$ index.php?listing=$1 [L]

Это работает само по себе, но оно будет взаимодействовать с вашим последним правилом, поэтому добавьте к нему условие, чтобы оно не зацикливалось

RewriteCond $0 !^/index.php($|/)  # $0 is what the RewriteRule matched
RewriteRule .* index.php/$0 [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...