将查询字符串重写为URL文件名的一部分?

时间:2014-09-03 20:34:34

标签: apache mod-rewrite

我有一个php网站,网址显示如下:

http://www.example.com/cheap-call-single.php?country=ALBANIA

我想重写它,显示为:

http://www.example.com/cheap-international-calls-ALBANIA.php

我搜索过许多只有发电机的人,他们都说要使用:

RewriteEngine On
RewriteRule ^cheap-international-calls-([^/]*)\.php$ /cheap-call-single.php?country=$1 [L]

但这对我不起作用,请注意服务器已启用正确的Apache设置。

有人可以用正确的语法帮助我吗?

1 个答案:

答案 0 :(得分:0)

您显示的rewriteRule执行反向操作,它以长格式传入网址并将其转换为查询字符串版本(使用?)。

现在问题是当你说:"我想重新写它,显示为:"

显示和重写通常是不同的事情:

如果'显示'是用户在浏览器中看到的网址:

  • 推动这种在你的应用程序中编写url的方式,以便收到的HTML包含正确的显示,这与mod_rewrite
  • 无关。
  • 您可以选择使用mod_rewrite执行HTTP重定向,因此当您检测到旧语法(cheap-call-single.php?country=ALBANIA)时,您将用户重定向到正确的语法,然后浏览器重新执行该请求(然后您应该在您的服务器上有一个cheap-international-calls-ALBANIA.php文件,否则它是最终的404)
  • 如果您在服务器上没有此文件(那么,您拥有的是cheap-call-single.php)那么暴露的rewriteRule是正确的并且回到第一步,它是您的应用程序,应该显示正确的HTML页面上的网址。

现在,如果您确实拥有cheap-international-calls-ALBANIA.php,并且希望应用程序使用cheap-call-single.php将传入请求重写为此文件,则根据查询字符串参数,您会遇到一些问题。在请求的查询字符串部分写入规则总是很复杂,查询字符串参数可能以任何顺序出现,可能是用urlencoding写的,等等。默认情况下rewriteRules不使用查询字符串部分。

这就像:

RewriteCond %{REQUEST_FILENAME} cheap-call-single\.php [NC]
RewriteCond %{QUERY_STRING} (^|&|%26|%20)country(=|%3D)([^&]+) [NC]
RewriteRule .* /cheap-international-calls-%3.php [L,R]

未经测试(对\.不确定),但未管理 country 字词中的每个字母都是urlencoded,而不管理国家/地区名称的大写。你需要一个RewriteMap来将它变换为大写。但是我已经头疼了,这是你真正需要的吗?