我有一个网站,其中的文章正在全球范围内提交,我将它们的位置记录为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
谢谢,
答案 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]
这条单一规则可以照顾而不是三条规则。