我有一个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设置。
有人可以用正确的语法帮助我吗?
答案 0 :(得分:0)
您显示的rewriteRule
执行反向操作,它以长格式传入网址并将其转换为查询字符串版本(使用?
)。
现在问题是当你说:"我想重新写它,显示为:"
显示和重写通常是不同的事情:
如果'显示'是用户在浏览器中看到的网址:
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来将它变换为大写。但是我已经头疼了,这是你真正需要的吗?