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文件,那么交换这两个块
不幸的是,我不知道有什么好的方法来强制使用尾部斜杠,特别是因为检查的条件