我正在试图弄清楚如何使用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]
任何人都知道我做错了什么?
答案 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
后重写循环。