mod_rewrite - 如何匹配URL,而不是它的子目录?

时间:2014-01-06 17:02:22

标签: apache .htaccess mod-rewrite

我有一个电子商务网站,产品网址采用以下格式:site.com/product/long-product-title-here?sku=skugoeshere并希望采用以下格式:site.com/product/long-product-title-here/skugoeshere

查询的一个原因是每个页面可能包含同一产品的多个变体。

我正在尝试使用mod_rewrite使用以下内容使其看起来更好:

  # RewriteCond %{QUERY_STRING} ^sku=(.+)$
  # RewriteCond %{REQUEST_URI} product/([^/]+)$
  # RewriteRule /([^/]+)$ /$1/%1 [R=301,L]

但这会进入site.com/product/title/title/title...

形式的重定向循环

如何使模式仅与原始网址匹配?

2 个答案:

答案 0 :(得分:1)

将此代码放入DOCUMENT_ROOT/.htaccess文件中:

RewriteEngine On

# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/+([^/]+/[^/]+)\?sku=([^\s&]+) [NC]
RewriteRule ^ /%1/%2? [R=302,L]

# internal forward from pretty URL to actual one
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} !(?:^|&)sku=[^&]+
RewriteRule ^([^/]+/[^/]+)/([^/]+)/?$ /$1?sku=$2 [L,QSA]

答案 1 :(得分:0)

跳过此处的前导斜杠

RewriteRule /([^/]+)$ $1/%1 [R=301,L]
                      ^ no slash here