使用 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]
我认为自己可以胜任 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]