【问题标题】:Custom URL in apache using get parametersapache中使用get参数的自定义URL
【发布时间】:2018-03-08 14:26:39
【问题描述】:

我正在尝试弄清楚如何使用 apache 网络服务器和 php 重写 url。

下面的url是真正的未重写的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]

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

【问题讨论】:

  • 您的.htaccess 文件在哪里?
  • 抱歉,它与 index.php 位于同一文件夹中。而且它是服务器上唯一的htaccess,并且在服务器端没有任何配置
  • 它是否总是应该重写为index.php(如您的代码所建议的那样)还是应该重定向到 URL 中指定的任何基本名称(如您的 URL 所建议的那样)?例如。 ..../foo/26..../foo.php?id=26?
  • 我主要想知道如何重写到一个特定的文件,但如果一个通用的解决方案看起来有点相似,我也会很高兴这样的解决方案。但是,如果我在正确的方向上得到帮助,我可以自己解决这个问题

标签: php apache .htaccess mod-rewrite


【解决方案1】:

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

所以,鉴于.htaccess 文件位于/rewritetest/.htaccess(与文档根目录相反,即/.htaccess),那么...

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

如果您请求/rewritetest/index/12 形式的 URL,那么上面的RewriteRule pattern 实际上不会匹配任何内容。它尝试匹配“index/12”,但您的模式不包含斜杠,因此会失败。 (字符类中的+是故意的吗?)

请尝试以下方法:

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

这显然专门匹配 URL 中的“索引”。如果您总是重写index.php,那么您实际上并不需要 URL 中的“索引”——除非这意味着不同的东西?这也假设id 参数的值仅由数字组成。

要将更通用的 .../&lt;controller&gt;/26 重写为 .../&lt;controller&gt;.php?id=26(如 cmets 所述),请尝试以下操作:

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

在每个目录的.htaccess 文件中,与RewriteRule 模式 匹配的URL 路径上省略了斜杠前缀,因此不需要/?。上面的模式也匹配idsomething,而不是anything。所以,/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]

或者,对于更通用的 .../&lt;controller&gt;/26.../&lt;controller&gt;.php?id=26(如上),然后将 RewriteRule 更改为:

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

REDIRECT_STATUS 环境变量的额外检查是为了防止在之前将URL 重写为/index.php?id=12 之后出现重写循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2020-09-15
    相关资源
    最近更新 更多