Php 如何使用.htaccess重写URL(删除id?=1)

Php 如何使用.htaccess重写URL(删除id?=1),php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我已经看遍了所有的地方,还没有弄清楚如何使这项工作,我相信这对那些知道自己在做什么的人来说是非常简单的。对于初学者,我已经确保启用了mod_rewrite,并且删除.php扩展正在工作,所以我知道这不是问题所在 目前我正在一个论坛上工作,我想做的只是删除URL的?id=1方面,因此基本上使URL看起来像这样: http://url.com/Forum/Topic/1 而不是 http://url.com/Forum/Topic?id=1 /Forum是一个目录,其中包含名为Topic.php

我已经看遍了所有的地方,还没有弄清楚如何使这项工作,我相信这对那些知道自己在做什么的人来说是非常简单的。对于初学者,我已经确保启用了mod_rewrite,并且删除
.php
扩展正在工作,所以我知道这不是问题所在

目前我正在一个论坛上工作,我想做的只是删除URL的
?id=1
方面,因此基本上使URL看起来像这样:

http://url.com/Forum/Topic/1
而不是

http://url.com/Forum/Topic?id=1
/Forum
是一个目录,其中包含名为
Topic.php的文档

我当前的
.htaccess
如下所示:

Options -MultiViews
RewriteEngine on

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

如果您已将应用程序中的URL更改为使用
http://example.com/Forum/Topic/1
然后尝试以下操作:

# Remove .php file extension on requests
RewriteRule ^(.+)\.php$ /$1 [R,L]

# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]

# Append .php extension for other requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ /$1.php [END]
检查
%{REQUEST_FILENAME}.php
的原始条件不一定是检查要重写的同一个“URL”-取决于请求的URL

更新:但是如何添加另一个ID变量,如在make
http://example.com/Forum/Topic/1?page=1
看起来像
http://example.com/Forum/Topic/1/1

因此,换句话说,
/Forum/Topic/1/2
转到
/Forum/Topic.php?id=1&page=2
。您可以添加另一条规则。例如:

# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]

# Specific rewrite for /Forum/Topic/N/N
RewriteRule ^(Forum/Topic)/(\d+)/(\d+)$ $1.php?id=$2&page=$3 [END]
或者,您可以将它们合并为一条规则。然而,这意味着当省略第二个参数时,您将得到一个空的
page=
URL参数(尽管这应该不是问题)


(?:/(\d+))
部分与可选的第2个参数匹配。括号内的
?:
使其成为非捕获组(否则,我们会得到一个与
/2
匹配的额外捕获子模式)后面的
使整个组成为可选组。

假设您已将应用程序中的URL更改为使用
http://example.com/Forum/Topic/1
然后尝试以下操作:

# Remove .php file extension on requests
RewriteRule ^(.+)\.php$ /$1 [R,L]

# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]

# Append .php extension for other requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*?)/?$ /$1.php [END]
检查
%{REQUEST_FILENAME}.php
的原始条件不一定是检查要重写的同一个“URL”-取决于请求的URL

更新:但是如何添加另一个ID变量,如在make
http://example.com/Forum/Topic/1?page=1
看起来像
http://example.com/Forum/Topic/1/1

因此,换句话说,
/Forum/Topic/1/2
转到
/Forum/Topic.php?id=1&page=2
。您可以添加另一条规则。例如:

# Specific rewrite for /Forum/Topic/N
RewriteRule ^(Forum/Topic)/(\d+)$ $1.php?id=$2 [END]

# Specific rewrite for /Forum/Topic/N/N
RewriteRule ^(Forum/Topic)/(\d+)/(\d+)$ $1.php?id=$2&page=$3 [END]
或者,您可以将它们合并为一条规则。然而,这意味着当省略第二个参数时,您将得到一个空的
page=
URL参数(尽管这应该不是问题)


(?:/(\d+))
部分与可选的第2个参数匹配。括号内的
?:
使其成为一个非捕获组(否则我们会得到一个与
/2
匹配的附加捕获子模式),后面的
使整个组成为可选组。

“…我知道这不是问题所在”-那么您遇到了什么问题?您发布的内容中似乎没有任何与此相关的代码?我只是想弄清楚如何显示页面,因为我在网上寻找解决方案,但还没有遇到同样情况的解决方案,只是无法弄清楚。“…所以我知道这不是问题所在”-那么你有什么问题?在您发布的内容中似乎没有任何与此相关的代码?我只是想知道如何显示页面,因为我已经在网上寻找解决方案,但还没有遇到适用于相同情况的解决方案,只是无法找到。欢迎您。只是补充一下,删除
.php
文件扩展名的“重定向”是一个302(临时)重定向。如果您确信这是可行的,那么请考虑将此更改为301(永久)重定向,将<代码> R<代码>更改为<代码> R=301 < /COD>。抱歉添加到POST中,但是我将如何添加另一个ID变量,与制作<代码>http://example.com/Forum/Topic/1?page=1
看起来像
http://example.com/Forum/Topic/1/1
?您可以添加另一条规则,也可以将这两种变体合并为一条规则。我已经更新了我的答案,不客气。只是补充一下,删除
.php
文件扩展名的“重定向”是一个302(临时)重定向。如果您确信这是可行的,那么请考虑将此更改为301(永久)重定向,将<代码> R<代码>更改为<代码> R=301 < /COD>。抱歉添加到POST中,但是我将如何添加另一个ID变量,与制作<代码>http://example.com/Forum/Topic/1?page=1看起来像
http://example.com/Forum/Topic/1/1
?您可以添加另一条规则,也可以将这两种变体合并为一条规则。我已经更新了我的答案。