我需要重写一堆 URL(大约 100 个左右)以用于 SEO 目的,并且将来可能会添加更多 URL(以后可能还会添加 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/yet_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测试=1
ETC...
并且它们都被重写为(目前):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]
但我觉得这听起来不太有效。有没有更好的方法?
答案1
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 了。由于我的记忆力不太好,上面的配置可能需要一些调整。
答案2
正则表达式应该能够完成这个任务。
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]
只需根据需要更改/编辑/添加值。