Перепишите термины URL, разделенные знаком равенства, на строку (и) запроса - PullRequest
2 голосов
/ 21 августа 2011

Используя mod_rewrite, какие RewriteRule (s) могли бы правильно выполнить следующие два примера?

Пример # 1 (один термин):

http://example.net/dir/thanks
-to-
http://example.net/dir/index.php?a=thanks

Пример # 2 (два термина):

http://example.net/dir/thanks=stackoverflow
-to-
http://example.net/dir/index.php?a=thanks&b=stackoverflow

Примечание: Файл .htaccess находится в / dir / вне корневого домена.

Я близко подошел к этому:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)=([^/]*)/?$ index.php?a=$1&b=$2 [L]

Тем не менее, для работы с примером № 1 требуется трейлинг "=" (которого я хочу избежать). Я пытался изменить "=" на "=?" в регулярном выражении, чтобы сделать его необязательным, но тогда, когда он работает, например, # 1, он терпит неудачу, например, # 2.

Спасибо за внимание к моему вопросу. Я новичок в mod_rewrite и regex, и я действительно в замешательстве.

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Я вижу два основных подхода:

1. Более безопасный / простой для понимания и расширяемый при необходимости. Создайте два правила : 1-й поймает thanks=stackoverflow, а 2-й будет работать только с thanks:

RewriteEngine On

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# will work with /thanks=stackoverflow
RewriteRule ^([^/=]+)=([^/=]+)/?$ index.php?a=$1&b=$2 [L]
# will work with /thanks
RewriteRule ^([^/=]+)/?$ index.php?a=$1 [L]

2 . Объедините эти два правила в одно правило . В этом случае параметр b= всегда будет присутствовать, но будет пустым для сценария thanks:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/=]+)(=([^/=]+))?/?$ index.php?a=$1&b=$3 [L]

Проверено оба - отлично работает на моем Apache box.

0 голосов
/ 21 августа 2011

Почему бы не создать два отдельных правила перезаписи:

i) Тот, который заботится о примере 1 - с добавленной проверкой, что он не содержит знака равенства [чтобы вы не сравнивали пример 2 с правилом перезаписи 1]

ii) Еще один, который заботится о примере 2

...