Php 使用.htaccess清理获取URL

Php 使用.htaccess清理获取URL,php,apache,.htaccess,Php,Apache,.htaccess,在任何人发表评论之前,我知道有很多关于这个话题的帖子,但是没有一个能解决我的问题,这就是为什么我开始写这个帖子的原因 因此,我在我的网站上有一个名为project.php的页面,用于GET查询,如:project.php?id=12我想要一个.htaccess文件,将给定的URL转换为localhost/MyWeb/project/id/12/。我确实关注了每一篇关于这个话题的帖子,但似乎没有一篇有效 另外,除此之外,我希望所有.php和.html文件只显示它们的名称,即localhost/My

在任何人发表评论之前,我知道有很多关于这个话题的帖子,但是没有一个能解决我的问题,这就是为什么我开始写这个帖子的原因

因此,我在我的网站上有一个名为
project.php
的页面,用于
GET
查询,如:
project.php?id=12
我想要一个.htaccess文件,将给定的URL转换为
localhost/MyWeb/project/id/12/
。我确实关注了每一篇关于这个话题的帖子,但似乎没有一篇有效

另外,除此之外,我希望所有
.php
.html
文件只显示它们的名称,即
localhost/MyWeb/index.php/
变成
localhost/MyWeb/index/
localhost/MyWeb/sub1/sub2.php
变成
localhost/MyWeb/sub1/sub2/

编辑:


我没有首先添加我的工作的原因是因为我认为它不会有任何帮助。但这是:

重新编写引擎打开
重写规则^([0-9]+)$project.php?id=$1
重写规则^([0-9]+)/$project.php?页面=$1
重写cond%{REQUEST_FILENAME}-F
重写规则^([^\.]+)$$1.php[NC,L]
重写规则^([^\.]+)$$1.html[NC,L]

首先,您在子目录(
MyWeb
)外操作,这意味着您需要设置一个
RewriteBase
。此外,您需要确保
.htaccess
文件位于该子目录中,而不是本地主机文档根目录中

因此,在
上重写引擎的下方插入以下行:

RewriteBase/MyWeb/
接下来,您声明要将
project.php?id={id}
转换为
project/id/{id}
,但您的代码省略了
/id/
段。我还注意到你有两条规则,第二条规则与你的问题相矛盾,所以我只向你展示你需要对第一条规则进行的更改,直到你澄清第二条规则的用途

要使项目URI正常工作,请将第一条规则更改为:

RewriteRule^project/id/([0-9]+)/?$project.php?id=$1[QSA,L]
这将匹配您想要的URI,并带有可选的尾部斜杠。我还添加了
QSA
标志,该标志将任何额外的查询字符串参数附加到rewitten URI,以及
L
标志,如果规则匹配,该标志将停止处理

接下来,要从URI中省略
.php
.html
,请将最后三行更改为以下内容:

RewriteCond%{REQUEST_FILENAME}.php-f
重写规则^([^\.]+)$$1.php[L]
RewriteCond%{REQUEST_FILENAME}.html-f
重写规则^([^\.]+)$$1.html[L]
当您向
localhost/MyWeb/index
发出请求时,Apache将检查
localhost/MyWeb/index.php
localhost/MyWeb/index.html
是否存在,然后将服务于它最先找到的任何一个

如果您同时拥有PHP和HTML文件,那么将提供PHP文件,而不是HTML文件。如果您更喜欢提供HTML文件,那么交换这两个块

不幸的是,我不知道有什么好的方法可以强制它们使用尾随斜杠,特别是因为检查它们是否存在的条件。换句话说,如果您使用trailins斜杠请求
sub2/
,它将不起作用,因为它需要检查
sub2/.php
是否存在,而它不存在

更新:为了增加好处,请将这两个块放在您先前设置的新的
RewriteBase
的正下方,以将旧URI重定向到新URI,同时允许对新URI的重写仍然有效:

RewriteCond%{THE_REQUEST}\/project\.php\?id=([0-9]+)[NC]
重写规则^project/id/%1/[R=302,L,QSD]
重写cond%{THE_REQUEST}\/MyWeb/(.+)\(php | html)
RewriteCond%{REQUEST_FILENAME}-f
重写规则^1[R=302,L]

作为参考,这里是完整的文件:

首先,您在子目录(
MyWeb
)中操作,这意味着您需要设置一个
RewriteBase
。此外,您需要确保
.htaccess
文件位于该子目录中,而不是本地主机文档根目录中

因此,在
上重写引擎的下方插入以下行:

RewriteBase/MyWeb/
接下来,您声明要将
project.php?id={id}
转换为
project/id/{id}
,但您的代码省略了
/id/
段。我还注意到你有两条规则,第二条规则与你的问题相矛盾,所以我只向你展示你需要对第一条规则进行的更改,直到你澄清第二条规则的用途

要使项目URI正常工作,请将第一条规则更改为:

RewriteRule^project/id/([0-9]+)/?$project.php?id=$1[QSA,L]
这将匹配您想要的URI,并带有可选的尾部斜杠。我还添加了
QSA
标志,该标志将任何额外的查询字符串参数附加到rewitten URI,以及
L
标志,如果规则匹配,该标志将停止处理

接下来,要从URI中省略
.php
.html
,请将最后三行更改为以下内容:

RewriteCond%{REQUEST_FILENAME}.php-f
重写规则^([^\.]+)$$1.php[L]
RewriteCond%{REQUEST_FILENAME}.html-f
重写规则^([^\.]+)$$1.html[L]
当您向
localhost/MyWeb/index
发出请求时,Apache将检查
localhost/MyWeb/index.php
localhost/MyWeb/index.html
是否存在,然后将服务于它最先找到的任何一个

如果您同时拥有PHP和HTML文件,那么将提供PHP文件,而不是HTML文件。如果您更喜欢提供HTML文件,那么交换这两个块

不幸的是,我不知道有什么好的方法来强制使用尾部斜杠,特别是因为检查的条件