如何为国家,州,城市重写这些网址?

时间:2012-01-29 11:29:48

标签: php apache mod-rewrite

我有一个网站,其中的文章正在全球范围内提交,我将它们的位置记录为Country -> State -> City,因为我生成了以下网址:

site/location/countryname/statename/cityname

我有一个php文件可以处理即将到来的请求并获取查询字符串中的值,现在的问题是如何编写mod_rewrite以便它可以像上面那样使用URL?

PS:如果有人删除了州名或国家名,则不应传递空值,表示URL可以是:

site/location/countryname
site/location/countryname/statename
site/location/countryname/statename/cityname

但不能:

site/location//statename/cityname
site/location/countryname//cityname

在上面的网址中,如果删除了countryname,则statename不应被视为countryname。读取文件名为location.php

谢谢,

3 个答案:

答案 0 :(得分:0)

尝试编写最长条件的规则 -

RewriteRule ^page/(.*)/(.*)/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3&statename=$4&cityname=$5 [QSA]
RewriteRule ^page/(.*)/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3&statename=$4 [QSA]
RewriteRule ^page/(.*)/(.*)/(.*)$ page.php?site=$1&location=$2&countryname=$3 [QSA]

答案 1 :(得分:0)

  • 首先确保每个斜杠之间没有斜杠(/)。这是([^/]*)
  • 然后确保从不为空。它是+而不是*。所以,现在,它是 ([^/]+)
  • 然后在验证规则后立即停止:使用L指令。
  • 不要忘记通过QSA指令使查询字符串跟随。

以下是您的最终规则:

RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3&statename=$4&cityname=$5 [QSA,L]
RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3&statename=$4 [QSA,L]
RewriteRule ^page/([^/]+)/([^/]+)/([^/]+)$ page.php?site=$1&location=$2&countryname=$3 [QSA,L]

如果这还不够:

两个提示:

如果您在托管环境中(=如果它是您自己的服务器可以修改虚拟主机,不仅仅是.htaccess文件),尝试使用RewriteLog指令:它可以帮助您找出这些问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢检查regexp的工具:

http://www.quanetic.com/Regex(别忘了选择ereg(POSIX)而不是preg(PCRE)!)

答案 2 :(得分:0)

好的,我有办法做到这一点:

RewriteRule ^bylocation/([-a-z_]+)(?:/([-a-z_]+)(?:/([-a-z_]+))?)?/?$ location.php?country=$1&state=$2&city=$3 [NC,L,QSA]

这条单一规则可以照顾而不是三条规则。