Мне нужно сохранить все строки пользовательских запросов.
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 в вашем случае) не будут работать в рамках пропущенных правил.