mod_rewrite, соответствующий определенному шаблону - PullRequest
0 голосов
/ 17 февраля 2012

Название довольно двусмысленное, поэтому я прошу прощения.

Проблема заключается в следующем коде.Мне нужно добавить действия после оператора ключевого слова, однако я не хочу, чтобы действие переопределяло ключевое слово, когда действие отсутствует.

Входной URL с действиями: http://websitenamehere/uk/en/meet-us/update и без: http://websitenamehere/uk/en/meet-us

Таким образом, я хочу, чтобы предложение actions запускалось только тогда, когда в результате получается строка из 4 или более символов.Это правило htaccess не должно зависеть от страны или языка, установленного при сравнении.

Если я что-то пропустил, пожалуйста, дайте мне знать, и я обновлю вопрос.Я знаю, это должно быть довольно просто, но в данный момент я просто промахиваюсь через htaccess и наклоняюсь, пока иду.

#language
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]{2})/([a-z]{2})(?:/(.*)|)$ /$1/$3?lang=$2 [NC,QSA,PT]

#country
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]{2})(?:/(.*)|)$ /$2?country=$1 [NC,QSA,PT]

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT]

#actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT]

#withoutactions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT]

RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/$ /$1.php [NC,QSA,PT]

1 Ответ

0 голосов
/ 20 февраля 2012

Я понял это сегодня. По сути, файл htaccess при создании обратной ссылки проходит через правила более одного раза.

Я добавил пропуск в исходную строку ключевого слова, но он будет просто проигнорирован:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT,S=1]

#withoutactions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT]

#actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT]

Когда htaccess запускается во второй раз, S больше не применяется, и затем он попадает в блок withoutactions. Чтобы обойти это, я просто проверил, существует ли уже ключевое слово в строке запроса и если да, чтобы пропустить правило:

#keyword
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(.*)/$ /$2?keyword=$1 [NC,QSA,PT,S=1]

#withoutactions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteCond %{QUERY_STRING} !keyword
RewriteRule ^([^/]+)/(.*)$ /$2?keyword=$1 [NC,QSA,PT]

#actions
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php !-f
RewriteRule ^([^/]+)/(.*)$ /?action=$1 [NC,QSA,PT]

Надеюсь, это поможет кому-то, у которого возникла подобная проблема с обратными ссылками!

...