Apache2 - 将一堆指定路径名的 URL 重写为一个 URL

Apache2 - 将一堆指定路径名的 URL 重写为一个 URL

我需要重写一堆 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/foob​​ar_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]

只需根据需要更改/编辑/添加值。

相关内容