Как я могу использовать несколько переменных URL?

Я буду конвертировать такие URL-адреса

example.com/tasks.php?action=list
example.com/tasks.php?action=detail&id=48
example.com/tasks.php?action=add&name=Test

в те

example.com/tasks/list
example.com/tasks/detail/48
example.com/tasks/add?name=Test

Итак, мне нужны две переменные, но вторая должна быть необязательной, расширение файла должно быть скрыто и мне нужно добавить переменные get.

Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
27
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, я украл базу с чьей-то страницы GitHub (здесь):

Original URL:
http://www.example.com/index.php?category=fish
Desired destination URL:
http://www.example.com/category/fish/
.htaccess syntax:

RewriteEngine On
RewriteRule ^/?category/([^/d]+)/?$ index.php?category=$1 [L,QSA]

Вы можете просто добавить еще один параметр. С несколькими параметрами:

RewriteEngine On
RewriteRule ^/?tasks/([A-Za-z]{0,})/?$ tasks.php?action=$1 [L,QSA]
RewriteRule ^/?tasks/([A-Za-z]{0,})/([0-9]{0,})/?$ tasks.php?action=$1&id=$2 [L,QSA]

При этом вы можете опубликовать красивую версию ссылок, и сервер будет направлять трафик на URL-адреса с параметрами GET за кулисами.

Обновлено: первое правило по умолчанию поймает ваш третий случай из-за QSA.

Что ж, вы можете просто реализовать разные правила перезаписи для этих трех отдельных ситуаций. Это делает правила простыми и ясными, поэтому их легко поддерживать:

RewriteEngine on 
RewriteRule ^/?tasks/([^/]+)/?$ /tasks.php?action=$1 [END]
RewriteRule ^/?tasks/([^/]+)/(\d+)$ /tasks.php?action=$1&id=$2 [END]
RewriteRule ^/?tasks/([^/]+)/([^/]+)/([^/]+)/?$ /tasks.php?action=$1&$2=$3 [END]

Это позволит реализовать эти перезаписи:

/tasks/list => /tasks.php?action=list

/tasks/detail/48 => example.com/tasks.php?action=detail&id=48

/tasks/add/name/Test => example.com/tasks.php?action=add&name=Test

Если вы получаете внутреннюю ошибку сервера (состояние http 500) при использовании приведенного выше правила, то, скорее всего, вы используете очень старую версию http-сервера apache. В этом случае вы увидите определенный намек на неподдерживаемый флаг [END] в файле журнала ошибок вашего http-сервера. Вы можете попробовать обновить или использовать старый флаг [L], он, вероятно, будет работать так же в этой ситуации, хотя это немного зависит от ваших настроек.

Это правило будет работать аналогичным образом в конфигурации хоста http-серверов или внутри файла динамической конфигурации (файл ".htaccess"). Очевидно, что модуль перезаписи должен быть загружен внутри http-сервера и включен на http-хосте. Если вы используете файл динамической конфигурации, вам нужно позаботиться о том, чтобы его интерпретация была включена в конфигурации хоста и чтобы он находился в папке DOCUMENT_ROOT хоста.

И общее замечание: вы всегда должны размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (.htaccess). Эти файлы динамической конфигурации добавляют сложности, часто являются причиной неожиданного поведения, их трудно отлаживать, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

Другие вопросы по теме