.htaccess 使用两个参数重写.php URL,并将旧的.php URL重定向到新的.htm URL

5lhxktic  于 2022-11-16  发布在  PHP
关注(0)|答案(1)|浏览(161)

我已经在我的htaccess文件中设置了RewriteRules来将我的php URL重写为SEO友好的.htm URL。现在我必须设置301 Redirect来将php URL指向新的htm URL,但是找不到解决方案。正如你可能猜到的,我不熟悉重写/重定向规则:(在我的htaccess中,我对accessory.php和accessory-details.php文件都有这样的规则,它工作得很完美。

RewriteRule accessories-(.*)\.htm$ accessories.php?lang=$1
RewriteRule accessory-details-id-(.*)-(.*)\.htm$ accessory-details.php?id=$1&lang=$2

问题是我仍然可以访问php的网址。php的网址有很好的排名,所以我需要这个301重定向为SEO的目的。我如何做重写和301重定向?注意,一些文件有一个和其他文件有两个GET参数。我不能设置一个工作代码自己,这让我生气。这只是两个例子,有很多类似的“对”的文件在我的根,但是我想如果我能让这两个文件工作的话,我可以设法使代码适应其他文件。

6pp0gazn

6pp0gazn1#

'id'参数是一个整数- 1 2,3,...,'lang'参数是一个字符串-“en”或“fr”。例如:'accessory-details.php?id=6&lang=en'(带参数的旧URL)和'accessory-details-id-6-en.htm' //新的SEO友好URL
您现有的正则表达式(子模式)太过通用。.*匹配任何内容(包括用作分隔符的连字符),因此导致正则表达式相当模糊。正则表达式应尽可能具体,以确保您不会不必要地重写(和 * 处理 *)从一开始就无效的URL。
假设您的.htaccess文件和其他文件位于文档根目录中,请尝试执行以下操作:

Options -MultiViews

RewriteEngine On

# Redirect old URLs (PHP files) to new URLs
RewriteCond %{QUERY_STRING} ^lang=([a-z]{2})$
RewriteRule ^accessories\.php$ /accessories-%1.htm [QSD,R=301,L]

RewriteCond %{QUERY_STRING} ^id=(\d+)&lang=([a-z]{2})$
RewriteRule ^accessory-details\.php$ /accessory-details-%1-%2.htm [QSD,R=301,L]

# Internal rewrites (new URL to file)
RewriteRule ^accessories-([a-z]{2})\.htm$ accessories.php?lang=$1 [END]
RewriteRule ^accessory-details-id-(\d+)-([a-z]{2})\.htm$ accessory-details.php?id=$1&lang=$2 [END]

END标志(Apache 2.4)确保在重写URL后不会发生进一步的处理-因此重写的URL不会被重定向(在处理的第二阶段,Llast)标志会发生这种情况)。
这些指令还假设您的URL不包含其他URL参数,除了所述的idlang。并且始终按照所述的顺序。即id=123&lang=aa,而不是lang=aa&id=123
%1%2反向引用包含从前面的 CondPattern 中捕获的值。
外部重定向上的QSD(查询字符串丢弃)标志对于从重定向响应中丢弃原始查询字符串是必需的。
注意:首先测试302(临时)重定向以避免潜在的缓存问题。在测试之前,您可能需要清除浏览器缓存。

相关问题