2011-06-29 118 views
1

我试图查看多个mod_rewrite问题,所以我很抱歉如果这是重复的。301重定向中的尾部斜线

我试图设置它,所以如果你去domain.com/about.php它会删除.php文件,如果你去了domain.com/about,它就是这样。

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ /$1.php [L,QSA] 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

所以,现在如果你去domain.com/about它显示的页面,但如果你去domain.com/about.php它不会删除的扩展。

此外,我有301重定向

redirect 301 /our-clients http://www.domain.com/about-ourclients 

这一工程完美,但如果用户进入与尾部斜杠domain.com/our-clients/,它们被定向到约-ourclients.php

有关如何重写规则的任何建议?

回答

2

这应该做的工作:

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/

# remove .php ONLY if requested directly 
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1) 
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA] 

# remove trailing slash ONLY if it is not an existing folder 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/$ /$1 [L,R=301] 

# rewrite to FILENAME.php if such file does exist and is not a folder 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ /$1.php [L,QSA] 
  1. 会重定向所有请求定向到PHP文件:/something.php将被重定向到/something

  2. 将删除尾随斜线IF请求的资源是不是目录。因此,如果您请求/home/并且您确实有这样的文件夹,那么它将不会被重定向到/home

  3. 如果它存在,是否会在内部重写请求到同一个已命名的PHP文件。如果你要求​​而你有/about.php那么它会重写;如果你没有/about.php则没有任何反应(至少不是这些规则 - 如果你有更多的规则,那么这样的请求可以稍后匹配..或404错误页面将被显示)。

  4. 如果您要求​​,您有/about.php,并且您还有​​文件夹,则请求将进入文件夹。如果你不希望发生这种情况(​​应该总是被重写为/about.php),那么你需要从最后一个块中删除RewriteCond %{REQUEST_FILENAME} !-d。但是因为你在当前的.htaccess中的条件完全相同,所以我认为这是期望的行为。

+0

完美无瑕。非常感谢! – brianrhea