【问题标题】:How to rewrite these urls for country, state, city?如何为国家、州、城市重写这些网址?
【发布时间】:2013-07-15 08:24:29
【问题描述】:

我有一个网站,其中有来自世界各地的文章,我将它们的位置记录为Country -> State -> City,为此我生成的 URL 如下:

site/location/countryname/statename/cityname

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

PS:如果有人删除了statename或countryname,它不应该传递空值,意味着URL可以是:

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

但不能:

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

在上面的网址中,如果国家名被删除,那么国家名不应被视为国家名。读取文件名为location.php

谢谢,

【问题讨论】:

标签: php apache mod-rewrite


【解决方案1】:

尝试编写条件优先的规则-

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]

【讨论】:

  • 不,这是最简单的,但如果我删除在我的帖子中读取 PS 的中间值,它将不起作用
  • 如果您将 (.*) 更改为 MUST-CONTAIN_VALUE,我认为它是 (.+),并在即将到来的规则中处理已删除的中间值 - 例如RewriteRule ^page/(.*)//(.*)$
【解决方案2】:
  • 首先确保每个斜线之间没有斜线 (/)。这是([^/]*)
  • 然后确保它从不为空。它是+ 而不是*。所以,现在是 ([^/]+)
  • 然后在规则通过验证后立即停止:使用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

我最喜欢的检查正则表达式的工具:

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

【讨论】:

    【解决方案3】:

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

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

    这一条规则可以处理,而不是三个规则。

    【讨论】:

      猜你喜欢
      • 2017-10-20
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2011-03-23
      相关资源
      最近更新 更多