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

Мне нужно переписать кучу URL (около 100 или около того) для целей SEO, и в будущем может быть добавлено еще больше (вероятно, еще 50-100 позже). Мне нужен гибкий способ сделать это, и пока, единственный способ, о котором я могу подумать, - это отредактировать файл.htaccess, используя механизм перезаписи.

Например, у меня есть несколько таких ссылок (обратите внимание, что строка запроса не имеет значения и динамична; это может быть что угодно. Я использовал их только в качестве примера. Я сосредоточен только на имени пути - части между именем хоста и строкой запроса, как отмечено жирным шрифтом ниже):

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/still_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]

Но это звучит не очень эффективно для меня. Есть ли способ лучше?

2 ответа

Первое, что вы можете сделать, это то, что вам не нужно 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]

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

Другие вопросы по тегам