0

我在强制删除 URL 中的 .php 文件扩展名时遇到了一点问题。

如果用户,我可以成功删除 .php 文件扩展名:

#Remove PHP if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule ^(.*)\.php(\?.*)?$ $1$2 [R=301,L]

我的目标是在以下情况下也删除扩展名:

# Remove PHP if original request is /foo.php/bar

我问是因为现在用户可以转到 URL 并键入http://www.site.com/contact.php/about,它会呈现我的关于页面。我的目标是强制删除 .php 并呈现: http ://www.site.com/contact/about

我希望将上面的代码添加到其中,但我无法弄清楚。

TIA

4

4 回答 4

2

以下.htaccess给了我请求的参数,你可以得到“页面”

AddDefaultCharset utf-8
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]

DirectoryIndex index.php

RewriteRule ^([a-zA-Z0-9_-]{3,20})/([^/]+)/([^/]+)?$ index\.php?page=$1&s=$2&o=$3 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})/([^/]+)?$ index\.php?page=$1&s=$2 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})/?$ index\.php?page=$1 [L]

RewriteRule ^([a-zA-Z0-9_-]{3,20})?$ index\.php?page=$1 [L]

ErrorDocument 404 /404

获取“页面”参数,然后像这样调用它

include('inc/'.$_REQUEST['page'].'.php');

并记住从您的链接中删除.php分机

于 2012-09-11T14:43:17.507 回答
1

看起来你得到了删除部分,但你错过了内部重写部分。您尝试php从 URL 中删除并将客户端重定向到没有它的 URL。但是您的条件与请求不匹配,请将其更改为:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ .*\.php.*$
RewriteRule ^(.*)\.php(.*)?$ /$1$2 [R=301,L]

然后你需要在内部重写它(不要重定向浏览器)。所以在同一个 htaccess 文件中,添加:

RewriteCond %{REQUEST_URI} ^/([^/]+)(.*)$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([^/]+)(.*)$ /$1.php$2 [L]
于 2012-09-11T14:58:56.857 回答
0

我对这些问题的解决方案是基本上避免使用复杂的重写规则,并通过简单的前端控制器从 php 端进行 URL 路由。

在您网站的根目录中写入以下 .htaccess 文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

然后在同一目录下编写一个 index.php 文件。在 index.php 文件中,仍然可以获取到整个 URL 信息,并根据此选择要包含的 PHP 文件。

<?php
// urldecode and get rid of the query string, $_GET is still available
$url = urldecode(preg_replace('/\\?(.*)$/', '', $_SERVER['REQUEST_URI']));

if ($url == '/contact/about') {
    include 'contact.php';
}

该示例非常基础,我可能忽略了您网站架构的细微之处,但从长远来看,这种方法更可行,因为您可以真正将您喜欢的任何 URL 映射到 PHP 脚本,而不必忍受 mod_rewrite 的复杂性.

这是几乎所有现有 PHP 框架(至少是 MVC 框架)都采用的模式。

这种方法的一个极简示例可以在 Slim 微框架中找到:http ://www.slimframework.com/

于 2012-09-12T09:37:35.523 回答
0

用这一条替换你的拖线:(你的规则有一个错误,这就是为什么它没有在中间检测到 .php 并且你不需要重写条件)

RewriteRule ^(.+)\.php(/.*)?$ /$1$2 [L,R=301]
于 2012-09-11T14:40:58.397 回答