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

Apache2 - переписать кучу URL-адресов с указанными путями в один URL-адрес

Мне нужно переписать кучу 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]

Просто измените / отредактируйте / добавьте значения по мере необходимости.