2011-06-21 68 views
0
RewriteEngine on 
RewriteCond %{http_HOST} ^domain.com [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]+)/$ $1.php 
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ /$1/ [R=301,L] 

第一条规则正在工作,因此它正确地重定向浏览器。但是,第二条规则应该是剥离.php,以便访问者可以转到domain.com/services而不是domain.com/services.php,但不起作用。第三个条件增加了/到最后,起作用。mod_rewrite删除.php不工作

任何想法,为什么剥.PHP给了我一个404错误:

The requested URL /s/p/domain.com/public/packing-tips.php was not found on this server? 

有什么建议?

+0

如果你直接去URL(最后带.php),它会显示你的网页?例如,如果您访问domain.com/services.php或domain.com/packing-tips.php,那么您是否会收到404? –

+0

不,我没有得到404,页面显示完全如其应该。但是,当我从地址栏手动删除.php时,它会显示上述错误。 – brianrhea

回答

0

试试这个亲爱的:

RewriteRule ^([^/]+)/$1 

希望会帮助你。

0

请尝试删除这条线,并再次检查:

RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 
0

对于剥离出PHP扩展使用此代码的.htaccess:

Options +FollowSymlinks -MultiViews 
RewriteEngine on 

RewriteCond %{THE_REQUEST} ^GET\s.+\.php [NC] 
RewriteRule ^(.+)\.php$ /$1 [NE,R=301,L,NC] 

RewriteCond %{REQUEST_URI} !\.php$ [NC] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)/?$ /$1.php [L] 
+0

当我转到domain.com/sizes-and-pricing.php时,它显示正确。当我删除.php时,出现此错误: 在此服务器上未找到请求的URL /sizes-and-pricing/.php。 – brianrhea

+0

@samseaborn:稍微修改我的答案,以照顾您遇到的尾部斜杠'/'问题。请再试一次。 – anubhava

0
RewriteEngine on 
# force canonical name 
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] 
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,QSA] 

# Add .php to requested resource (if such php file does exist) 
# e.g. www.example.com/services/ => www.example.com/services.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.+)/$ /$1.php [QSA,L] 

# Force trailing slash to be present (only if such file does not exist) 
# e.g. www.example.com/services => www.example.com/services/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*[^/])$ /$1/ [R=301,QSA] 

如果您要求此URL domain.com/services它会如果这样的文件/文件夹不存在,则将其重定向到domain.com/services/。然后,如果(只有IF)确实存在,则它将被重写为。如果没有这样的PHP文件,那么你应该看到404错误。

从理论上讲,你可以在“force canonical name”规则之后添加这些行,然后你可以稍后摆脱一些RewriteCond规则(如果你有很多重写规则很有用),但是你必须在你的站点上验证这一点 - 它适用于我,但你可能有特定的情况:

# Do not do anything for already existing files 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule .+ - [L]