从url的末尾删除.php文件扩展名。

时间:2012-07-27 16:29:54

标签: .htaccess mod-rewrite file-extension

我想在我的网络服务器上实现一些非常简单的事情。我希望以.php结尾的网址以/例如www.example.net/something.php结尾为www.example.net/something或www.example.net/folder/subfolder/something.php为www。 example.net/folder/subfolder/something。另外我不介意我是否有www.example.net/folder/something.php?something=whatever/。我只关心删除网址中的最后一个.php。我在许多其他人中使用过此代码。

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

然而,这仅适用于我的某些页面。例如,它不适用于我的www.example.com/folder/contactus.php页面。相反,我得到了我的404页面。但它完全适用于www.example / folder / faq.php。 另外,我在代码的各个部分中创建了一些file_get_contents()php请求。有没有办法定制这些规则,所以内部请求(我的PHP函数)不受影响。基本上我只希望浏览器显示没有.php结尾的url而不影响我在.php文件中保存的其他php函数。为了进一步澄清我的意图:我使用字符串处理函数根据我设置的变量从php文件中提取特定的文本行。但是使用当前的重写规则,无法找到php文件,因为扩展名已从文件名中删除(我猜测。

$file_contents = file_get_contents($filename);

我目前在共享的godaddy主机帐户上使用Linux服务器。

2 个答案:

答案 0 :(得分:0)

我认为您需要将php检查应用于这两个规则:

RewriteCond %{REQUEST_URI} ^(.*)/$
RewriteCond %{DOCUMENT_ROOT}%1.php -f 
RewriteRule (.*)/$ $1.php [L]

RewriteCond {REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

此外,需要在没有尾部斜杠的情况下进行-f检查

答案 1 :(得分:0)

以下工作符合要求,但我的一个页面使用了获取失败的请求。我刚把它改成了一个帖子请求,一切都很顺利。

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^GET\ /([^.\ ]+\.)+php(\?[^\ ]*)?\ HTTP
RewriteRule ^(.+)\.php$ http://www.sitename.net/$1 [R=301,L]
RewriteRule ^([^/]+/)*index/?$ http://www.sitename.net/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ http://www.sitename.net/$1 [R=301,L]
RewriteCond $1 !^([^.]+\.)+([a-z0-9]+)$ [NC]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*[^/])$ /$1.php [L]
RewriteRule (.*)/$ $1.php [L]

仍然存在一个小问题。有些页面会附加尾部斜杠,而其他页面则不会附加。有关强制尾随斜线的任何线索吗?