2015-08-20 55 views
1

我认为我自己可以合理地使用PHP。然而,我对mod_rewrite完全失去了信心。使用mod_rewrite进行搜索引擎友好链接的尾部斜杠问题

我有一个URL结构,工作方式类似于以下内容:重定向到

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

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

它永远只能传递给脚本的最后的“文件夹”。前面的'文件夹'(如果有)用于搜索引擎优化和结构目的。

如果有前面的文件夹“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=$1 [L] 
RewriteRule ^(.*) index.php?page=$1 [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}/$1/ [L,R=301] 

的问题?

http://site/something/thepage 

重定向到

​​

恐怕在世界上所有的谷歌搜索并没有帮助我,因为我不能完成我的左右脑的mod_rewrite在所有!

感谢任何帮助。

回答

0

你会更好使用这样的:

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

如果您想扭转这种局面,并去掉尾随斜线代替,然后使用此:

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

然后你会需要相应地改变你的重写:

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

非常好 - 非常感谢你,这已经做到了。 – in2itive