Apache 如何使用htaccess将url重定向到url

Apache 如何使用htaccess将url重定向到url,apache,.htaccess,redirect,mod-rewrite,Apache,.htaccess,Redirect,Mod Rewrite,我不知道如何质疑这个问题,但我的问题是这样的 我已经为url编写了一个规则 RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+) index.php?store=$1 RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+)/products index.php?store=$1&view=products RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+)/products/([0-9]+) ind

我不知道如何质疑这个问题,但我的问题是这样的

我已经为url编写了一个规则

RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+) index.php?store=$1
RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+)/products index.php?store=$1&view=products
RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+)/products/([0-9]+) index.php?store=$1&view=products&category=$2
RewriteRule ^mysite.com.pk/([a-zA-Z0-9]+)/single/([0-9]+) index.php?store=$1&view=single&product=$2
我是新来的
htaccess
,所以我对它了解不多。有没有一种方法,即使旧的url类似于
index.php?store=abc&view=single&product=123

这将被重定向到一个新的规则,如
mysite.com.pk/abc/single/123

您必须对建议的规则进行一些小的修改才能使其生效。您必须添加额外的重写规则,以实现实际要求:将“旧”URL重定向到新语法

这可能就是您正在寻找的:

RewriteEngine on

RewriteRule ^/?([a-zA-Z0-9]+)$ index.php?store=$1 [END]
RewriteRule ^/?([a-zA-Z0-9]+)/products$ index.php?store=$1&view=products [END]
RewriteRule ^/?([a-zA-Z0-9]+)/products/([0-9]+)$ index.php?store=$1&view=products&category=$2 [END]
RewriteRule ^/?([a-zA-Z0-9]+)/single/([0-9]+)$ index.php?store=$1&view=single&product=$2 [END]

# index.php?store=xyz&view=single&product=123
RewriteCond %{QUERY_STRING} store=([^&]+)&?
RewriteCond %{QUERY_STRING} view=single&?
RewriteCond %{QUERY_STRING} product=([^&]+)&?
RewriteRule /?index.php$ /%1/single/%3 [END,R=301]

# index.php?store=xyz&view=products&product=123
RewriteCond %{QUERY_STRING} store=([^&]+)&?
RewriteCond %{QUERY_STRING} view=products&?
RewriteCond %{QUERY_STRING} category=([^&]+)&?
RewriteRule /?index.php$ /%1/products/%3 [END,R=301]

# index.php?store=xyz&view=products
RewriteCond %{QUERY_STRING} store=([^&]+)&?
RewriteCond %{QUERY_STRING} view=products&?
RewriteRule /?index.php$ /%1/products [END,R=301]

# index.php?store=xyz
RewriteCond %{QUERY_STRING} store=([^&]+)&?
RewriteRule /?index.php$ /%1 [END,R=301]
这些规则在
.htaccess
样式的文件和真实的http主机配置中应该是一样的。请看下面的注释

如果您使用的是旧版本的apache http服务器,那么您可能必须将
END
标志替换为
L
标志。如果您收到“内部服务器错误”(http状态500),并且服务器抱怨错误日志文件中的
END
标志,请尝试这样做。在这种情况下,您可能需要添加一些附加条件来防止无休止的重写循环

请注意,我没有测试该规则集。我希望它没有包含任何愚蠢的错误,你一定要测试它

以上所有内容都假设
mysite.com.pk
与您的主机名(“域”)匹配。但这不起作用,因为重写规则是在请求路径上工作的,而不是在完整的URL上。如果要将规则的应用限制到特定主机,则可以添加前置条件以停止重写过程:

RewriteCond %{HTTP_HOST} !^mysite\.com\.pk`
RewriteRule .* - [END]


还有一个一般提示:您应该始终希望将这些规则放在http服务器主机配置中,而不是使用
.htaccess
样式的文件。这些文件是出了名的容易出错,难以调试,而且它们确实降低了服务器的速度。只有在您无法控制主机配置的情况下(阅读:非常便宜的主机服务提供商),或者如果您的应用程序依赖于编写自己的重写规则(这是一个明显的安全噩梦),才提供它们作为最后一个选项。

您的第一个规则与当前的所有规则匹配,不是吗?你应该用收尾锚。我不明白你在说什么,克里斯!1.您需要更改这些规则的顺序,否则它将始终是应用的第一条规则。2.您希望在规则与3匹配后使用标志结束重写过程。您希望为外部重定向添加规则以实现实际请求。如果没有结束锚,
^mysite.com.pk/([a-zA-Z0-9]+)
也将匹配
^mysite.com.pk/([a-zA-Z0-9]+)/products
请求,因为
^mysite.com.pk/([a-zA-Z0-9]+)
允许在匹配后进行任何操作。@chris85我非常怀疑
mysite.com.pk
是为了匹配主机名(“域”),这在
重写规则中永远不会发生。
…这正是我要寻找的,并将对其进行测试。让你知道,你注意到我已经复制到我的注册。。。我会研究一下你的规则是否有效。但是我对规则进行了注释,现在每当我键入
index.php?store=abc
时,它都会继续重定向到
abc/store=abc
,即使我删除了听起来像是从缓存加载的
.htaccess
文件。清除和/或禁用浏览器缓存,进行“深度重新加载”,并确保不使用代理服务器。欢迎使用!记住:请你自己回馈这个社区;-)@阿卡斯卡。我很惊讶
RewriteRule/?index.php$/%1/products/%3[END,R=301]
能够正常工作。1) 如果最后没有
,它默认为
[QSA]
,而不是
[QSD]
。和2)使用手册%1到%9中通常说明的
%3
,可以从最后一次匹配的重写开始访问模式的分组部分。最新版本的操作是否有变化?