Мне нужно переписать кучу URL-адресов (около 100 или около того) для целей SEO, и в будущем, возможно, будут добавлены другие (возможно, еще 50-100 позже). Мне нужен гибкий способ сделать это, и пока единственный способ, который я могу придумать, - это отредактировать файл .htaccess с помощью механизма перезаписи.
Например, у меня есть несколько таких URL-адресов (обратите внимание, что строка запроса неактуальна и динамична; это может быть что угодно. Я использовал их только в качестве примера. Я сосредотачиваюсь только на имени пути - части между именем хоста и строкой запроса, как выделено жирным шрифтом ниже):
http://example.com/seo_term1? utm_source = google & utm_medium = cpc & utm_campaign = seo_term http://example.com/another_seo_term2? utm_source = facebook & utm_medium = cpc & utm_campaign = seo_term
http://example.com/еще_another_seo_term3? utm_source = example_ad_network & utm_medium = cpc & utm_campaign = seo_term http://example.com/foobar_seo_term4
http://example.com/blah_seo_term5? test = 1
и т.д...
И все они переписываются (пока): http://example.com/
Как это сделать наиболее эффективным / действенным способом, чтобы в будущем я мог добавить больше терминов?
Одно из решений, с которым я столкнулся, - это сделать это (в файле .htaccess):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [NC,QSA]
Однако проблема с этим решением заключается в том, что даже недопустимые URL-адреса (например, http://example.com/blah
) будет переписан на http://example.com
вместо того, чтобы давать код 404 (что он и должен делать). Я все еще пытаюсь понять, как все это работает, и единственный способ, который я могу придумать, - это написать еще 100 RewriteCond
заявления (такие как: RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR]
) перед RewriteRule
директива. Например:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} =/seo_term1 [NC,OR]
RewriteCond %{REQUEST_URI} =/another_seo_term2 [NC,OR]
RewriteCond %{REQUEST_URI} =/yet_another_seo_term3 [NC,OR]
RewriteCond %{REQUEST_URI} =/foobar_seo_term4 [NC,OR]
RewriteCond %{REQUEST_URI} =/blah_seo_term5 [NC]
RewriteRule ^(.*)$ / [NC,QSA]
Но для меня это звучит не очень эффективно. Есть ли способ лучше?
Первое, что вы можете сделать, это то, что вам не нужен RewriteCond
линий вообще.
RewriteRule /seo_term1 / [NC,QSA]
Делает именно то, что сейчас делают ваши две строки.
Второе улучшение, которое вы могли бы сделать, - это использовать RewriteMap
. Сама карта перезаписи может быть обновлена без перезапуска Apache.
RewriteMap seo txt:/etc/apache2/maps/seo.txt
RewriteRule (.*) ${seo:$1} [NC,QSA]
и seo.txt
содержит
/seo_term1 /
/seo_term2 /
Примечание: я фактически не использовал RewriteMap в течение нескольких лет. Приведенная выше конфигурация может потребовать некоторой настройки из-за моей несовершенной памяти.
Регулярное выражение должно быть способно справиться с этим.
RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/[^\?]+\?(?=.*(utm_source\=(google|msn|yahoo)))(?=.*(utm_medium\=(cpc|ppc)))(?=.*(utm_campaign\=[a-zA-Z0-9._-]+))
RewriteRule ^(.*)$ / [L,R=301]
Вышеупомянутое будет соответствовать только строке, содержащей все указанные параметры, независимо от ведущей (до?) Строки.
Редактировать ...
Хорошо, теперь вы немного изменили свой вопрос. Но, к счастью, это еще проще.
RewriteEngine on
RewriteCond %{REQUEST_URI} ^\/(seo_term1|seo_term2)(.*)?
RewriteRule ^(.*)$ / [L,R=301]
Просто измените / отредактируйте / добавьте значения по мере необходимости.