【问题标题】:Rewrite URL Structure重写 URL 结构
【发布时间】:2014-04-08 22:55:39
【问题描述】:

我想更改我网站的 URL 结构。我当前的 URL 结构是这样的:

www.domain.com/events/events.php?location=san%20francisco

我想把网址结构改成:

www.domain.com/events/san-francisco

我的 XMPL 站点地图列出了与第一个示例一样的 URL。我希望搜索引擎像第二个示例一样索引 URL。为了实现这一目标,我需要做些什么? location 参数中的 {city} 是动态的,具体取决于用户的 IP 地址。我是否需要更改我的 XML 站点地图以列出新的 URL 结构?我需要在我的.htaccess 文件中添加什么。我是否需要将我网站上的实际 URL 链接更改为新结构,或者我可以使用 .htaccess?

【问题讨论】:

  • 您的 PHP 是否接受 www.domain.com/events/events.php?location=san-francisco 而不是 %20 或者您是否能够添加该功能?如果您可以添加它,那么您将很容易做您想做的事情,如果您不能,那么它将使用大量服务器资源进行从%20 到 dash 的转换,如果您托管在共享服务器。
  • @prix 是的,它确实接受旧金山

标签: .htaccess mod-rewrite url-rewriting rewrite


【解决方案1】:

这应该可行:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^(GET|POST)\ /events\.php\?location=(.*)%20(.*)\ HTTP
RewriteRule ^ /events/%2-%3\? [R=302,L]

RewriteRule ^events/(.*)$ /events.php?location=$1 [L]

当您知道重定向正确时,将 R=302 更改为 R=301

编辑:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^(GET|POST)\ /(.*)/(.*)\.php\?location=(.*)%20(.*)&lid=(.*)&slid=(.*)\ HTTP
RewriteRule ^ /%3/%4-%5/%6/%7\? [R=302,L]
RewriteRule ^(.*)/(.*)/(.*)/(.*)$ /$1/$1.php?location=$2&lid=$3&slid=$4 [L]

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /(.*)/(.*)\.php\?location=(.*)%20(.*)\ HTTP
RewriteRule ^ /%3/%4-%5\? [R=302,L]
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)$ /$1/$1.php?location=$2 [L]

【讨论】:

  • 感谢您的回答。但是对于我的页面 nightclubs/nightclubs.php 和 photos/photos.php 呢?是否有可用于所有页面的通用重写规则,还是必须为每个页面创建规则?
  • 参数?location=也和他们一起吗?
  • 是的位置参数是他们。这是另一个变体。你能给我这个例子的一般规则吗?夜总会/nightclubs.php?location=San%20francisco&lid=1234&slid=5678。还有我如何让它改变 San%20francisco 到 San-francisco ?
【解决方案2】:

您必须使用与以下类似的 .htaccess 文件。它将匹配花哨的 URL 并将请求转发到正确的 php 文件。

RewriteEngine On
RewriteRule ^([^/]*)/(.*)$ /$1/$1.php?location=$2

这样,www.domain.com/events/events.php?location=san%20francisco 和 www.domain.com/events/san-francisco 将指向同一个页面。

但是,如果您不更改站点地图或站点上的链接,搜索引擎将不会知道这一点。 然后你有2个解决方案:

  • 使用新的结构 URL 更改站点和站点地图中的所有链接
  • 使用重定向规则将“旧”页面重定向到“新”页面

根据我对 SEO 的了解,第一个选项是最好的。或者更好的是,两种解决方案的组合:更改所有链接,并使用重定向 301 规则,这样已经被搜索引擎索引的页面不会失去排名并避免重复内容。

RewriteRule ^([^/]*)/(.*).php?location=(.*)$ http://www.yourdomain.com/$1/$3 [R=301]

【讨论】:

  • 感谢您的回答。但是对于我的页面 nightclubs/nightclubs.php 和 photos/photos.php 呢?是否有可用于所有页面的通用重写规则,还是必须为每个页面创建规则?
  • 再次感谢您的回答。这是另一个变体。你能给我这个例子的一般规则吗?夜总会/nightclubs.php?location=San%20francisco&lid=1234&slid=5678。还有我如何让它改变 San%20francisco 到 San-francisco ?抱歉所有其他问题。提前致谢。
  • 您想要 Nightclubs/nightclubs.php 的哪个 URL 重写?location=San%20francisco&lid=1234&slid=5678 ?并且要更改 San%20francisco,这应该使用 PHP 或您使用的任何语言直接在您的站点中完成。如果你想进行重定向,你可以这样做: RewriteRule ^([^/]*)/(.*)%20(.*)$ yourdomain.com/$1/$2-$3 [R=301] 但是你会得到一个重定向链:www .domain.com/events/events.php?location=san%20francisco --> www.domain.com/events/san%20francisco --> www.domain.com/events/san-francisco
  • 这是我想要的重写网址:Nightclubs/san-francisco/1234/5678
  • RewriteEngine On # 没有 ID 的简单 URL 的规则 1 RewriteRule ^([^/]*)/(.*)$ /$1/$1.php?location=$2 # 带盖子的 URL 的规则 2并滑动 RewriteRule ^([^/]*)/([^/]*)/([0-9]+)/([0-9]+)$ /$1/$1.php?location=$2&lid= $3&slid=$4
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多