【问题标题】:Is it possible to use mod_rewrite htaccess to rewrite a url from name to id.是否可以使用 mod_rewrite htaccess 将 url 从名称重写为 id。
【发布时间】:2011-08-22 00:23:40
【问题描述】:

如果我有一个 URLhttp://www.domain.com/listing.php?company_id=1,我是否可以通过使用该 ID 从数据库中提取名称来将其重写为 http://www.domain.com/company-name

或者我是否必须更改listing.php才能使其成为?company_name=company-name

如果有人能指出我正确的方向,那就太好了。

谢谢!

【问题讨论】:

  • rewrite 只会帮助你以一种很酷的方式编写你的 URL,但据我所知,它只是一个正则表达式解析器......也许你可以用 HTML5 历史和 Ajax 来解决它
  • 查看地图功能。我知道映射文本文件(我从数据库中导出),但我相信 mod_rewrite 也确实从数据库中映射。这里可能有关于这个的问题,但如果明天仍然悬而未决,我会尽力回答。

标签: php .htaccess mod-rewrite url-rewriting


【解决方案1】:

map 函数允许在 url 中完全不使用 id,同时仍使用重写后的 url 中的 id 来进行数据库查找。

http://www.domain.com/another-one

映射到

http://www.domain.com/listing.php?company_id=3423

以下是我如何使用从数据库查询生成的地图文本文件。我相信 mod_rewrite 也可以直接映射到我不熟悉的数据库(也许有人可以提供那个答案)。我使用 Helicon Tech 的 isapi_rewrite v3,它的工作方式类似于 mod_rewrite,所以这应该适合你。

名为 map_company.txt 的示例地图文件

some-company 12
another-one 3423
freds-fill-dirt-and-croissants 44

重写规则:

RewriteMap map_company txt:map_company.txt [NC] 

RewriteCond ${map_company:$1|NOT_FOUND} !NOT_FOUND
RewriteRule ^/(.*) /listing.php?company_id=${map_company:$1} [NC,QSA,L]

RewriteMap 将 map_company.txt 文本文件分配给名为 map_company 的变量(为了保持一致而命名相同)。

RewriteRule 正在做这项工作。它将斜线之后的所有内容捕获为$1,然后将其重写到您的listing.php url。 ${map_company:$1} 正在查找地图文件中的 url,并返回 id。

RewriteCond 只是在仔细检查列表是否存在。 $1 来自 RewriteRule url,如果未找到,则 NOT_FOUND 是默认值,条件是它是否为 not-NOT_FOUND(有点纠结 - 但它只是检查它是否在文件中)。如果它在文件中,将运行 RewriteRule。如果它不在文件中,它会跳过 RewriteRule,并进入更多规则(可能是页面未找到或其他默认值)。

【讨论】:

  • 非常感谢。我学到了很多。我不知道 ReweriteMap。现在我收到一个“内部服务器错误”,所以不确定这是我的主机问题还是代码问题,但我现在正在与 HostGator 进行实时聊天,所以希望我们能解决这个问题!
  • 显然我的主机不支持它! :(
  • 感谢您的回答勾选标记。确保文件的位置没问题——我的文件位于网站根目录,带有我的 .htaccess 文件,因此仅使用简单的文件名即可。我认为您也可以使用完整的 C:\... 路径,但主机通常也不喜欢这样。最坏的情况,M_rk 对 Devraj 的 cmets 的回答也是一个不错的解决方案;它只有一个 id。
  • 所以我可以使用 PHP 从那个 .txt 文件中的数据库中获取值?
  • 我不知道具体情况,但通常是的,您可以编写一些代码来读取数据库并创建 .txt 文件。
【解决方案2】:

您需要在两个 url 中使用 id,但只在用户的漂亮链接中使用全名。 以下将http://www.domain.com/42/company_name 重写为http://www.domain.com/listing.php?company_id=42 并丢弃公司名称。

RewriteEngine on
RewriteRule ^([0-9]*)/([A-Za-z0-9_]*)/$ /listing.php?company_id=$1 [L]

请注意,用户也可以访问 http://www.domain.com/42/wrong_name 并仍然以正确的公司名称登陆正确的页面。如果不希望这样做,您可以将规则更改为 /listing.php?company_id=$1&company_name=$2 并检查 listings.php 中的相等性

【讨论】:

  • 如果company-name slug 保证是唯一的,他们可以使用它而不是 ID。
  • @Phil 即使它是独一无二的,我也不建议使用它,因为使用 id 会加快在数据库中的查找速度。
  • CMSes 通过“创建”标题的小写 url 表示并用下划线替换空格来解决此问题。此过程将在存储记录时检查生成的别名是否唯一。显然是为了保证它的独特性。然后,您可以索引此属性以获得性能。
  • @Devraj 是的,小写连字符或下划线是一个很好的 url,对于 SEO 以及干净/独特。然后,如果它与正确的字符串不匹配,SEO 世界建议将 301 重定向到正确的值。这有助于防止您网站的“随机”网址被搜索引擎收录。
  • 另一个调整是将公司名称放在首位,如http://www.domain.com/company-name/42。搜索引擎可能会更加重视 url 的前面部分(我们真正能做的就是猜测 SEO)。 RewriteRule ^[^/]+/([\d]+)$ /listing.php?company_id=$1 [L] 调整规则以查找非斜杠,然后是斜杠(而不是显式字符),然后捕获数字。
猜你喜欢
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多