Предполагая, что вы изменили URL-адреса в своем приложении для использования http://example.com/Forum/Topic/1
, попробуйте следующее:
# Remove .php file extension on requests
RewriteRule ^(.+)\.php$ /$1 [R,L]
# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]
# Append .php extension for other requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ /$1.php [END]
Исходное условие, которое проверило %{REQUEST_FILENAME}.php
, не обязательно проверяет тот же "URL" что вы переписываете - в зависимости от запрошенного URL.
ОБНОВЛЕНИЕ: однако как бы я go добавил другую переменную ID, как при создании http://example.com/Forum/Topic/1?page=1
http://example.com/Forum/Topic/1/1
Другими словами, /Forum/Topic/1/2
переходит к /Forum/Topic.php?id=1&page=2
. Вы можете просто добавить другое правило. Например:
# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]
# Specific rewrite for /Forum/Topic/N/N
RewriteRule ^(Forum/Topic)/(\d+)/(\d+)$ $1.php?id=$2&page=$3 [END]
Кроме того, вы можете объединить их в одно правило. Однако это будет означать, что вы получите пустой page=
параметр URL, когда второй параметр пропущен (хотя это не должно быть проблемой).
# Specific rewrite for both "/Forum/Topic/N" and "/Forum/Topic/N"
RewriteRule ^(Forum/Topic)/(\d+)(?:/(\d+))?$ $1.php?id=$2&page=$3 [END]
The (?:/(\d+))?
часть соответствует необязательному второму параметру. ?:
в круглых скобках делает его не захватывающей группой (в противном случае мы получим дополнительный подпаттерн захвата, соответствующий /2
), а завершающий ?
делает всю группу необязательной.