Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用get参数在apache中自定义URL_Php_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Php 使用get参数在apache中自定义URL

Php 使用get参数在apache中自定义URL,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我试图弄清楚如何使用ApacheWebServer和php重写URL 下面的url是真实的未写入url: http://localhost:1337/rewritetest/index.php?id=12 我想在晚上到达 http://localhost:1337/rewritetest/index/12 我的索引文件如下所示: <?php echo $_GET['id']; ?> 有人知道我做错了什么吗 它与index.php位于同一文件夹中 因此,如果.htacce

我试图弄清楚如何使用ApacheWebServer和php重写URL

下面的url是真实的未写入url:

http://localhost:1337/rewritetest/index.php?id=12
我想在晚上到达

http://localhost:1337/rewritetest/index/12
我的索引文件如下所示:

<?php 
   echo $_GET['id'];
?>
有人知道我做错了什么吗

它与index.php位于同一文件夹中

因此,如果
.htaccess
文件位于
/rewritetest/.htaccess
(与文档根目录相反,即
/.htaccess
),则

如果您请求的URL格式为
/rewritetest/index/12
,则上述
RewriteRule
模式实际上不会匹配任何内容。它试图匹配“index/12”,但您的模式不包含斜杠,因此将失败。(字符类中的
+
是故意的吗?)

请尝试以下方法:

 RewriteRule ^(index)/(\d+)$ $1.php?id=$2 [L]
这显然与URL中的“索引”特别匹配。如果您总是重写到
index.php
,那么您就不需要在URL中使用“index”——除非这意味着不同的东西?这还假设
id
参数的值仅由数字组成

要将更通用的
../26
重写为
...php?id=26
(如前面提到的注释),请尝试以下操作:

 RewriteRule ^([\w-]+)/(\d+)$ $1.php?id=$2 [L]
在每个目录
.htaccess
文件中,与
重写规则
模式匹配的URL路径上省略了斜杠前缀,因此不需要
/?
。上面的模式也与
id
匹配,而不是任何内容。因此,
/index/
将不匹配


如果这是一个新站点,则不一定需要“重定向”(从
/index.php?id=12
返回到
/index/12
)。只有当您在现有站点上更改URL结构时,才真正需要这样做,因为旧URL已经有入站链接,并且被搜索引擎索引。在这种情况下,您可以在内部重写之前执行以下操作:

RewriteBase /rewritetest/

RewriteRule %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^id=(\d+)
RewriteRule ^(index)\.php$ $1/%1 [R,L]
或者,对于更通用的
../26
...php?id=26
(如上所述),请将
重写规则更改为:

RewriteRule ^([\w-]+)\.php$ $1/%1 [R,L]

REDIRECT\u STATUS
环境变量的额外检查是为了防止在先前将URL重写到
/index.php?id=12
后发生重写循环。

您的
.htaccess
文件位于何处?抱歉,它与index.php位于同一文件夹中。它是服务器上唯一的htaccess,服务器端没有配置任何东西。它总是应该重写为
index.php
(正如您的代码所建议的),还是应该重定向到URL中指定的任何basename(正如您的URL所建议的)?例如,
…/foo/26
…/foo.php?id=26
?我主要想知道如何重写到一个特定的文件,但如果通用解决方案看起来有点类似,我也会很乐意使用这种解决方案。然而,如果我能在正确的方向上得到帮助,我可以自己解决这个问题
RewriteBase /rewritetest/

RewriteRule %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^id=(\d+)
RewriteRule ^(index)\.php$ $1/%1 [R,L]
RewriteRule ^([\w-]+)\.php$ $1/%1 [R,L]