Исправить RewriteRule — доступ к идентификатору в конце строки, разделенной дефисом

#regex #.htaccess #mod-rewrite #url-rewriting

#регулярное выражение #.htaccess #мод-перезапись #url-переписывание

Вопрос:

У меня есть галерея изображений с более чем 3 тысячами изображений, и она продолжает расти. Мой URL-адрес для доступа к изображению следующий:

 1.
http://example.com/gallery/image/cloud-blue-plane-hawaii-428459

or 

2.
http://example.com/gallery/image/428459
 

Скрипт PHP находится здесь:

 http://example.com/gallery/image.php?image=428459
 

Итак, мне нужно написать RewriteRule для доступа к нему.

Я считаю, что правильное правило для второго url ( http://example.com/gallery/image/428459 ) выглядит следующим образом:

 RewriteRule ^gallery/image/(d |[^/] )/?$ gallery/image.php?image=$1 [L]
 

Я в некотором роде готов, когда пришло время написать правило для первого URL ( http://example.com/gallery/image/cloud-blue-plane-hawaii-428459 )… Я понятия не имею…

Есть ли способ создать одно правило для обоих URL-адресов?

Комментарии:

1. Не используйте or , чтобы сделать начальную часть необязательной. Я думаю gallery/image/D*(d )/?$ , это для вас.

2. Это решение почти работает. Если в строке есть цифра, она завершается ошибкой: http://example.com/gallery/image/cloud-blue-plane-99-hawaii-428459

Ответ №1:

Используйте

 ^gallery/image/[^/]*?([0-9] )/?$
 

Смотрите доказательство.

Объяснение

 --------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  gallery/image/           'gallery/image/'
--------------------------------------------------------------------------------
  [^/]*?                   any character except: '/' (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    [0-9]                    digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
  )                        end of 1
--------------------------------------------------------------------------------
  /?                       '/' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  $                        before an optional n, and the end of the
                           string