apache中的自定义URL使用get参数

时间:2017-09-27 07:41:32

标签: php apache .htaccess mod-rewrite

我正在试图弄清楚如何使用apache webserver和php重写网址。

下面的网址是真正的非写网址:

http://localhost:1337/rewritetest/index.php?id=12

我希望通过

达成目标
http://localhost:1337/rewritetest/index/12

我的indexfile如下所示:

<?php 
   echo $_GET['id'];
?>

这可能吗? “新”网址不包含任何参数名称,所以我想我必须使用参数的顺序,但我不知道如何在这种情况下达到它们。

以下是我的重写:

RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+)  
RewriteRule ^/?index.php$ %1? [R=301,L]  
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?id=$1 [L]

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

  

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

因此,假设.htaccess文件位于/rewritetest/.htaccess(而不是文档根,即。/.htaccess),那么......

RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?id=$1 [L]

如果您请求/rewritetest/index/12表单的网址,则上述RewriteRule 模式实际上不会匹配任何内容。它尝试匹配&#34; index / 12&#34;,但您的模式不包含斜杠,因此将失败。 (字符类中的+是否有意?)

请尝试以下内容:

 RewriteRule ^(index)/(\d+)$ $1.php?id=$2 [L]

这显然特别符合&#34; index&#34;在URL中。如果您总是重写index.php,那么您并不需要&#34;索引&#34;在URL中 - 除非这意味着不同的东西?这也假设id参数的值仅由数字组成。

要将更一般的.../<controller>/26重写为.../<controller>.php?id=26(如上所述的评论),请尝试以下内容:

 RewriteRule ^([\w-]+)/(\d+)$ $1.php?id=$2 [L]

在每个目录.htaccess文件中,在RewriteRule 模式匹配的URL路径上省略了斜杠前缀,因此/?不是需要。上述模式还匹配id ,而不是任何。因此,/index/不匹配。

如果这是一个新网站,那么&#34;重定向&#34; (从/index.php?id=12返回/index/12)不一定是必需的。如果您要更改现有网站上的URL结构,只有旧网址已有入站链接且被搜索引擎编入索引,那么这才真正需要。在这种情况下,您可以在内部重写之前执行以下

RewriteBase /rewritetest/

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

或者,对于更通用的.../<controller>/26.../<controller>.php?id=26(如上所述),请将RewriteRule更改为:

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

针对REDIRECT_STATUS环境变量的附加检查是为了防止在之前将URL重写为/index.php?id=12后重写循环。