Назад | Перейти на главную страницу

Один RewriteCond для нескольких RewriteRules

Мне нужно сохранить все строки пользовательских запросов.

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^$ index.html?page=home&%1

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^about$ index.html?page=about&%1

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^contact$ index.html?page=contact&%1

Как я могу указать RewriteCond для всех RewriteRules?

Я не с нетерпением жду единого универсального контроллера RewriteRule, поскольку это небольшой статический веб-сайт.

Для ваших трех примеров они будут работать:

RewriteRule ^$ index.html?page=home [QSA,L]
RewriteRule ^about$ index.html?page=about [QSA,L]
RewriteRule ^contact$ index.html?page=contact [QSA,L]

Уловка - это флаг "QSA".

edit: немного более общее решение, основанное на том, как это делает Drupal:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.html?page=$1 [L,QSA]

! -F важен, потому что в противном случае вы не смогли бы обслуживать изображения или сам index.html. Строку! -D можно опустить, в зависимости от того, что именно вы делаете. Может быть несколько иной подход:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ index.html?page=$1 [L,QSA]

который будет ловить / foo и / bar, но не / foo /, / bar / или / foo / bar.

Помимо того, что вы можете использовать QSA, знаете ли вы, что вы можете использовать %{QUERY_STRING} прямо в вашем RewriteRule ?:

RewriteRule ^$ index.html?page=home&%{QUERY_STRING}
RewriteRule ^about$ index.html?page=about&%{QUERY_STRING}
RewriteRule ^contact$ index.html?page=contact&%{QUERY_STRING}

Преимущество этого метода перед флагом QSA заключается в том, что вы можете контролировать порядок параметров в результирующей строке запроса. Например.:

    RewriteRule ^contact$ index.html?%{QUERY_STRING}&page=contact

Это гарантирует, что для параметра 'page' всегда установлено значение 'contact', даже если он уже содержится в исходной строке запроса. (По крайней мере, это верно для PHP, поскольку синтаксический анализатор строки запроса PHP всегда возвращает последний из нескольких идентичных параметров в массив $ _GET.)

Один RewriteCond для нескольких RewriteRules

Ваш заголовок подразумевает еще один вопрос, который тоже можно решить:

Вы можете использовать флаг RewriteRule S|skip чтобы связать несколько RewriteRules с одним RewriteCond (или с набором RewriteConds). Вот пример, который применяет одно Cond к трем правилам:

RewriteCond  %{HTTP_HOST}  !^www.mydomain.com$  [NC]
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule  .?  -  [S=3]
RewriteRule  ^path1(/.*)$  /otherpath1$1
RewriteRule  ^path2(/.*)$  /otherpath2$1
RewriteRule  ^path3(/.*)$  /otherpath3$1

Но это не решение вашей исходной проблемы, поскольку обратные ссылки на RewriteCond (например,% 1 в вашем случае) не будут работать в рамках пропущенных правил.