Php 如何在.htaccess中重定向特定模式URI

Php 如何在.htaccess中重定向特定模式URI,php,regex,apache,.htaccess,Php,Regex,Apache,.htaccess,我希望当有人点击URLmysite.com/products/sampeproductname/sampeproductid时,我的站点被重定向到products.php。它应该显示products.php文件 现在我已经编写了如下代码 RewriteCond %{REQUEST_URI} !^/products/[0-9a-zA-Z_-]/[0-9a-zA-Z_-]+$ RewriteRule ^(.*)$ products.php 它重定向所有的URL,但我希望它被重定向的URL结构类似于

我希望当有人点击URL
mysite.com/products/sampeproductname/sampeproductid
时,我的站点被重定向到products.php。它应该显示
products.php
文件

现在我已经编写了如下代码

RewriteCond %{REQUEST_URI} !^/products/[0-9a-zA-Z_-]/[0-9a-zA-Z_-]+$
RewriteRule ^(.*)$ products.php
它重定向所有的URL,但我希望它被重定向的URL结构类似于

mysite.com/products/iPhone-xr/10

这将为您指明正确的方向:

RewriteEngine on
RewriteRule ^/?products/(\w+)/(\d+)$ /products.php?prdName=$1&prdId=$2 [END]
(\w+)
是否在所有情况下都与产品名称匹配取决于您在那里使用的实际字符集,而您在问题中没有指定该字符集。你可能需要根据自己的需要来调整

如果您使用上述规则收到一个内部服务器错误(http状态500),那么很可能您操作的是非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到不支持的
[END]
标志的明确提示。您可以尝试升级或使用较旧的
[L]
标志,在这种情况下可能也会使用相同的标志,不过这取决于您的设置

此实现将在http服务器主机配置或分布式配置文件(“.htaccess”文件)中同样工作。显然,重写模块需要在http服务器中加载,并在http主机中启用。在使用分布式配置文件的情况下,您需要注意在主机配置中启用该文件的解释,并且该文件位于主机的
DOCUMENT\u ROOT
文件夹中


还有一个一般性的注释:您应该总是更喜欢将这些规则放在http服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实降低了http服务器的速度。只有在您无法访问真正的http服务器主机配置(读:真正廉价的服务提供商)或坚持编写自己的规则的应用程序(这显然是一个安全噩梦)的情况下,才提供它们作为最后一个选项

一,。您不需要为此使用RewriteCond,RewriteRule可以直接检查URL的路径组件。2.您的正则表达式与URL不匹配,并且由于它被否定,因此它允许按照以下规则进行重写。这条规则是为了匹配任何东西而编写的。那么,如何编写正则表达式以匹配您首先要针对的URL格式。像这样的工具可以(在一定程度上)对此有所帮助。它显示了500个响应。在apache错误日志中,它说“由于可能的配置错误,请求超过了10个内部重定向的限制。如果需要,使用'LimitInternalRecursion'增加限制。使用'LogLevel debug'获得回溯。”上述规则不会导致无休止的重写循环。您没有实现该规则,但对其进行了更改,或者您在此处有其他规则,但您没有告诉我们。
RewriteCond%{REQUEST_FILENAME}-d RewriteCond%{REQUEST\u FILENAME}.php-f RewriteCond%{REQUEST\u URI}!^/\。众所周知的/acme挑战/[0-9a-zA-Z_-]+$RewriteCond%{REQUEST\u URI}!^/\。著名的/cpanel dcv/[0-9a-zA-Z_u-]+$RewriteCond%{REQUEST\u URI}!^/\。著名的/pki验证/(?:\Ballot169)?重写条件%{REQUEST\u URI}!^/\。众所周知的/pki验证/[A-F0-9]{32}\.txt(?:\comdo\DCV)?$RewriteRule^(.*)$$1.php选项-索引
这是我在这些行下面的内容。如果我把代码放在下面,它会工作吗?事实上,我会把它放在那个规则上面,因为那个规则比一般的回退规则更专业。不管顺序如何,我都看不到重写循环。不过,您可能还需要在现有规则中添加一个
[END]
标志。