Как переписать URL с помощью .htaccess (удаление идентификатора? = 1) - PullRequest
1 голос
/ 09 февраля 2020

Я просмотрел все, и мне еще предстоит выяснить, как сделать эту работу, я уверен, что это очень просто для тех, кто знает, что они делают. Для начала, я убедился, что mod_rewrite включен и удаление расширений .php работает, поэтому я знаю, что это не проблема.

В настоящее время я работаю на форуме, и что я пытаюсь чтобы сделать это просто удалить ?id=1 аспект URL, поэтому в основном URL выглядит так:

http://url.com/Forum/Topic/1

Вместо

http://url.com/Forum/Topic?id=1

/Forum это каталог с документ с именем Topic.php

Мой текущий .htaccess выглядит следующим образом:

Options -MultiViews
RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 февраля 2020

Предполагая, что вы изменили 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), а завершающий ? делает всю группу необязательной.

...