2017-09-27 43 views
2

我想弄清楚如何重写使用Apache Web服务器和PHP的URL。在Apache中使用获取参数的自定义URL

下面的网址是真正的nonrewritten网址:

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

你的'.htaccess'文件位于哪里? – MrWhite

+0

对不起,它位于与index.php相同的文件夹中。并且它是服务器上唯一的htaccess,并且在服务器端没有配置任何东西 – DavidLar

+0

它总是应该重写为index.php(如代码所示),还是应该重定向到URL中指定的任何基本名称(因为您的URL建议)?例如。 '..../foo/26'到'..../foo.php?id = 26'? – MrWhite

回答

0

它位于同一文件夹中的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之后防止重写循环。

相关问题