使用 mod_rewrite 的尾部斜杠问题对 SEO 友好 URL

Trailing slash issue using mod_rewrite for SEO friendly URL

我认为自己可以胜任 PHP。然而,当谈到 mod_rewrite.

时,我完全迷失了。

我有一个 URL 结构,其工作方式如下:

http://site/something/something-else/the-actual-page/

重定向到:

http://site/index.php?page=the-actual-page

它只是传递给脚本的最后一个 'folder'。前面的 'folders'(如果有)用于 SEO 和结构目的。

如果前面有一个文件夹 "promotion",那么它会重定向到一个单独的文件。这是沿着:

http://site/promotion/campaign-name/

重定向到

http://site/promotion.php?campaign=campaign-name

我正在使用以下代码来实现此目的:

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^promotion/(.*)/$ promotion.php?params= [L]
RewriteRule ^(.*) index.php?page= [L]
</IfModule>

这按预期工作,链接正确重定向,除非没有尾部斜杠。例如

http://site/something/thepage/

会起作用,而

http://site/something/thepage

不会。

为了解决这个问题,我正在尝试设置一个 301,它将任何没有尾部斜线的 URI 重定向到带有尾部斜线的 URI。

下面的代码(位于其他规则之上)在一定程度上有效,但我丢失了文件夹数据。

代码:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}// [L,R=301]

问题是什么?

http://site/something/thepage

重定向到

http://site/thepage/

恐怕世界上所有的谷歌搜索都对我没有帮助,因为我根本无法思考 mod_rewrite!

感谢任何帮助。

你最好使用这个:

RewriteEngine On
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
# ... your other rerites

如果您想反转它并去掉尾部斜线,请使用:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [R=301,L]

然后您需要相应地更改您的重写:

RewriteRule ^promotion/(.*)$ /promotion.php?params= [L]