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

大卫·拉尔

我试图弄清楚如何使用apache webserver和php重写URL。

以下网址是真正的未重写网址:

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

我想达到

http://localhost:1337/rewritetest/index/12

我的索引文件如下所示:

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

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

下面是我自带的重写程序:

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]

有人知道我在做什么错吗?

怀特先生

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

因此,鉴于.htaccess文件位于/rewritetest/.htaccess(而不是文档根目录,即/.htaccess),则...

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

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

请尝试以下类似的方法:

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

显然,这明确匹配了URL中的“索引”。如果您始终重写为,index.php那么您真的不需要URL中的“索引”-除非这意味着不同?这也假定id参数的值仅由数字组成。

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

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

在按目录的.htaccess文件中,与RewriteRule 模式匹配的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]

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

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

REDIRECT_STATUS环境变量的附加检查是为了防止在将URL重写为/index.php?id=12较早版本之后进行重写循环

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章