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