我试图弄清楚如何使用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] 删除。
我来说两句