Php 使用get参数在apache中自定义URL
我试图弄清楚如何使用ApacheWebServer和php重写URL 下面的url是真实的未写入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
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]