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]
Просто измените / отредактируйте / добавьте значения по мере необходимости.