它位于同一文件夹中的index.php
因此,考虑到.htaccess
文件位于/rewritetest/.htaccess
(相对于文档根即/.htaccess
)然后...
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?id=$1 [L]
如果您请求的形式/rewritetest/index/12
的URL,然后上面的RewriteRule
模式实际上不会匹配任何东西。它试图匹配“索引/ 12”,但你的模式不包含斜线,所以会失败。 (是字符类中的+
故意的吗?)
试着这么做,而不是执行以下操作:在URL
RewriteRule ^(index)/(\d+)$ $1.php?id=$2 [L]
这显然符合具体“指标”。如果你总是改写为index.php
,那么你不需要在URL中“索引” - 除非这意味着不同的东西?这也假设id
参数的值仅包含数字。
要重写更一般的.../<controller>/26
到.../<controller>.php?id=26
(如前所述评论),那么你可以试试:
RewriteRule ^([\w-]+)/(\d+)$ $1.php?id=$2 [L]
在每个目录.htaccess
文件斜线前缀省略由匹配的URL路径上RewriteRule
模式,所以不需要/?
。以上模式也匹配东西为id
,而不是任何东西。所以,/index/
不匹配。
如果这是一个新的网站,然后在“重定向”(从/index.php?id=12
回/index/12
)不一定需要。如果您要更改现有网站上的旧网址已具有入站链接并被搜索引擎编入索引的网址,那么这才真正需要。在这种情况下你可以不喜欢以下前的内部重写:
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
之后防止重写循环。
你的'.htaccess'文件位于哪里? – MrWhite
对不起,它位于与index.php相同的文件夹中。并且它是服务器上唯一的htaccess,并且在服务器端没有配置任何东西 – DavidLar
它总是应该重写为index.php(如代码所示),还是应该重定向到URL中指定的任何基本名称(因为您的URL建议)?例如。 '..../foo/26'到'..../foo.php?id = 26'? – MrWhite