Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 简单的mod#u重写规则,用于凌乱的旧url';s_Apache_.htaccess_Mod Rewrite_Mod Alias - Fatal编程技术网

Apache 简单的mod#u重写规则,用于凌乱的旧url';s

Apache 简单的mod#u重写规则,用于凌乱的旧url';s,apache,.htaccess,mod-rewrite,mod-alias,Apache,.htaccess,Mod Rewrite,Mod Alias,为新客户启动新网站。他们的旧站点有大约50个产品,不幸的是,旧的产品名称与新的URL模式不匹配 旧URL示例: example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123 example.com/products.a

为新客户启动新网站。他们的旧站点有大约50个产品,不幸的是,旧的产品名称与新的URL模式不匹配

旧URL示例:

example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription

example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123

example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers

(旧URL有时会超过150个字符。)

新网址:

example.com/products/category/actual-product-name

从旧产品名称到新产品名称没有固定的、可识别的模式。这一类别没有任何限制

我尝试过简单的mod_别名重定向,但我知道我需要一个重写规则。但我有问题。我所需要的只是对这50个URL中的每一个进行1对1的重定向。我想我可以做一些类似的事情:

RewriteRule ^/products.aspx?category=Foo&product=ProductName
    /products/category/new-product-name/  [R=301,NC]
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name

但这是行不通的。我知道这应该很简单,但我被卡住了。有什么想法吗?

看看的
RewriteMap
指令

可以在文本文件中指定以下内容:

RewriteRule ^/products.aspx?category=Foo&product=ProductName
    /products/category/new-product-name/  [R=301,NC]
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
在您的
httpd.conf

RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]

提示:如果这是您想要的永久重定向,请确保设置适当的
缓存控件
过期
标题,以指示浏览器缓存301。

对其余重定向URL使用以下模式。请注意,通过在特殊字符前面添加一个
\
来转义它们,例如
和空格

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/  [R=301,NC]

您可以尝试以下方法:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$

RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
注:

  • 在per dir(.htaccess)上下文中,per dir前缀被剥离,因此您不能用
    ^/
    启动
    重写规则
    模式

  • 您必须使用
    RewriteCond
    来匹配查询字符串

  • 正如另一个答案中所述,如果您可以访问httpd.conf/该站点的vhost定义,那么
    RewriteMap
    解决方案可能适合这种情况。不过,我不确定这是如何处理查询字符串的

  • 对于类似的情况,将所有这些URL重写为服务器端脚本并使用该脚本为每个URL执行HTTP重定向可能是更好的解决方案


  • 为了保持良好的状态,您可能应该避开这段时间,例如
    products\.aspx
    。另外,请参阅下面关于RewriteCond的答案。在.htaccess中是否有其他重写规则会影响重写的URL?您可能希望在执行外部重定向时使用
    L
    标志。感谢JMM的响应。没有其他重写规则。站点的其余部分可以通过简单的重定向来处理。也没有外部重定向。您没有说明是否具有根配置访问权限,是否在vhost配置中或使用基于
    .htaccess
    的规则进行这些重写。因为如果后者为真,则映射不起作用,并且您的regexp是错误的:每个dir regexps没有前导/开。@TerryE-很抱歉说得含糊不清。这是在vhost中完成的,而不是在.htaccess文件中。请将此与Ulrich的解决方案结合起来,因为路径不包含查询字符串。+1感谢您没有使用明显(更复杂)的
    %{QUERY\u STRING}
    感谢您的回复。这是可行的,但url有一个令人费解的问题。它显示为:
    /products/category/new product name/?category=Foo&product=superlong…
    不是一个交易破坏者,但令人费解。另外,我没有使用RewriteBase,因为我必须直接将其放入vhost中。@u zero在末尾添加一个
    以抑制原始查询字符串,即
    RewriteRule^/products/category/new product name/?[R=301,NC]
    就是这样做的。有时我问一些愚蠢的问题,我也应该知道答案@乌尔里希·帕哈非常感谢你的帮助。还有一个问题-如果我有50个这样的问题,它会引起任何问题吗?@u-zero可能会在不知不觉中变慢,但不会引起问题