Я взял веб-сайт и заметил, что у предыдущего разработчика было несколько .htaccess
правила перезаписи, это краткий пример:
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^(.*)/landing$ landing.php?page=$1
Условие перезаписи всегда одинаково для всех правил, есть ли способ объединить правила перезаписи, чтобы условия просто нужно было записать один раз?
Я посмотрел на флаг пропуска, но у него нет обратной ссылки. Насколько я понимаю, мне не нужны обратные ссылки с этими условиями, однако, пропускает ли лучший подход? Или есть лучшая практика, как этого добиться? (Кто-то предложил мне использовать флаг QSA, однако после исследования я не думаю, что это имеет какое-либо отношение к тому, чего я хочу достичь.)
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$ RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
Этот беспорядочный блок условий автоматически вводится cPanel перед каждым RewriteRule
при автоматическом обновлении сертификата безопасности SSL (Let's Encrypt?). Эти условия обеспечивают доступность файла проверки (необходимого для обновления сертификата SSL).
К сожалению, я не смог разобраться в том, почему cPanel делает это таким образом - это может быть кошмар обслуживания, и я встречал директивы, которые были нарушены этими условиями (по общему признанию, директивы были не совсем идеальными с самого начала. ). (Я пробовал спрашивать на форумах cPanel, но никогда не получал хорошего ответа.)
... есть ли способ объединить правила перезаписи, чтобы условия просто нужно было записать один раз?
Да. Вы можете переместить эти условия в отдельный блок в начале .htaccess
файл и обеспечить регресс их значение, поэтому вместо того, чтобы запускать RewriteRule
когда запрос не соответствует шаблону (с использованием отрицается регулярное выражение). Вы можете предотвратить дальнейшие перезаписи, когда запрос действительно соответствует шаблону. Например:
# BEGIN cPanel SSL CERT RENEWAL
RewriteCond %{REQUEST_URI} ^/[0-9]+\..+\.cpaneldcv$ [OR]
RewriteCond %{REQUEST_URI} ^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/[0-9a-zA-Z_-]+$ [OR]
RewriteCond %{REQUEST_URI} ^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ - [L]
# END cPanel SSL CERT RENEWAL
Обратите внимание на удаление !
(отрицание) префикса на CondPattern и дополнительные OR
Отметьте первые три условия. В RewriteRule
затем предотвращает дальнейшую обработку директив mod_rewrite в случае совпадения запроса.
(В Apache 2.4.8+ эти директивы можно полностью перенести в конфигурацию сервера. С помощью RewriteOptions InheritDownBefore
.)
Затем следует просто RewriteRule
директивы, которые у вас были раньше (хотя я добавил L
флаг):
RewriteRule ^(.*)/landing/(.*)/(.*)$ landing.php?page=$1&id=$2&mid=$3 [L]
RewriteRule ^(.*)/landing/(.*)$ landing.php?page=$1&id=$2 [L]
RewriteRule ^(.*)/landing$ landing.php?page=$1 [L]
Вероятно, вы должны включить L
флаги оставшихся перезаписей.
Вы также можете объединить эти 3 перезаписи в одну директиву, если хотите, но это будет зависеть от того, обрабатывает ли ваше приложение пустые параметры URL.
(Кто-то предложил мне использовать флаг QSA, однако, по результатам исследования, я не думаю, что это имеет какое-либо отношение к тому, чего я хочу достичь.)
Да, это не имеет ничего общего с этой конкретной проблемой. В QSA
Флаг (Query String Append) позволит вам объединить любую строку запроса, которая присутствовала в запросе, со строкой запроса, которую вы пишете в RewriteRule
замена.