如何制作从id到名称的htaccess规则
我有一个独特的数据列表:
假设我有以下数据:
id name
1 Jhon
2 Peter
3 Mark
4 Scotty
5 Marry
我为id
做了一个.htaccess
规则:
RewriteRule brandlisting/(.*)/ site/brandlisting?id=$1 [L]
RewriteRule brandlisting/(.*) site/brandlisting?id=$1 [L]
我的网址是:
http://localhost/mate/admin/site/brandlisting/3
这适用于id。
现在我需要一个名称为.htaccess
规则,所以我为它制定了一个规则:
RewriteRule brandlisting/(.*)/ site/brandlisting?name=$1 [L]
RewriteRule brandlisting/(.*) site/brandlisting?name=$1 [L]
http://localhost/mate/admin/site/brandlisting/Mark
当我使用上面的URL时,我在控制台遇到以下错误:
“NetworkError:400错误请求 - http:// localhost / mate / admin / site / brandlisting / Mark”
并在浏览器中显示:
错误400您的请求无效。
我当前的.htaccess文件
RewriteEngine on
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$ [NC,OR]
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$
RewriteCond %{REQUEST_URI} !wordpress/
RewriteRule (.*) /wordpress/$1 [L]
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
#RewriteRule brandlisting/(.*)/ site/brandlisting?id=$1 [L]
#RewriteRule brandlisting/(.*) site/brandlisting?id=$1 [L]
RewriteRule brandlisting/(.*)/ site/brandlisting?name=$1 [L]
RewriteRule brandlisting/(.*) site/brandlisting?name=$1 [L]
.htaccess
规则依赖于命令。 如果您预计会使用很多路由,请使用多个已编写的路由框架之一来保持简单的htaccess规则,并将路由放入PHP中。
下面是关于为什么.htaccess
文件不能正常工作的解释:
RewriteEngine on
这导致RewriteEngine开启。 目前没有问题。
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$ [NC,OR]
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$
RewriteCond %{REQUEST_URI} !wordpress/
只匹配RewriteRule
是它的WordPress。 这似乎是有效的,所以我们忽略这些规则。
RewriteRule (.*) /wordpress/$1 [L]
Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
如果请求的文件名不是文件或目录,请仅在下面匹配。
RewriteRule .* index.php/$0 [PT,L]
重写任何路径PATH
到index.php / PATH
。 如果匹配则停止处理(注意L
为最后一个 )。 这意味着以下任何内容都不会被激活
#RewriteRule brandlisting/(.*)/ site/brandlisting?id=$1 [L]
#RewriteRule brandlisting/(.*) site/brandlisting?id=$1 [L]
RewriteRule brandlisting/(.*)/ site/brandlisting?name=$1 [L]
RewriteRule brandlisting/(.*) site/brandlisting?name=$1 [L]
假设它不匹配.*
(aka,从不),请检查其他模式的路径。 还要注意,你所评论的两条线和你不这样做的两条线都匹配相同的模式。 如果一个人工作,另一个不会。
- 专业提示:正则表达式有一个缩写,用于包含一个带有斜线但没有的规则: /?
相当于使用一个斜线或不使用斜线。 写这个的另一种方法是/{0,1}
。
怎么修
.htaccess
重定向规则是一种痛苦。 我的经验法则是让它们尽可能容易地书写,这使得它们易于阅读和维护。 这个怎么做? 将重定向逻辑推送到您的PHP程序,而不是强迫Apache依赖它。
解决方案1
这里的htaccess
-only方法将确保您了解Apache重写标志告诉服务器执行的操作,并相应地进行调整。 您可以通过以下两种方法之一完成此操作:
首先让你的具体规则出现。 /site/brandlisting?name=$1
规则移至before .*
规则。
为任何后续处理添加单独的重写条件。 根据上面链接的Apache2文档:
[L]标志导致mod_rewrite停止处理规则集。 在大多数情况下,这意味着如果规则匹配,则不会处理更多规则。 这对应于Perl中的最后一个命令或C中的break命令。使用此标志来指示当前规则应立即应用,而不考虑其他规则。
这里的关键在于它在每个规则集内 。 构建新的规则集将继续处理。
应该工作的示例(未测试):
RewriteEngine on
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$ [NC,OR]
RewriteCond %{HTTP_HOST} ^localhost/mate/admin$
RewriteCond %{REQUEST_URI} !wordpress/
RewriteRule (.*) /wordpress/$1 [L]
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
#New Rule Set
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Note that /? is the same as writing two separate rules,
# one with a slash at the end, and one without.
RewriteRule brandlisting/(.*)/? site/brandlisting?name=$1 [L]
有一些伟大的预建路由器,如Silex和Slim。 如果你不想使用它们,你仍然可以使用你自己的内部逻辑来解析各个部分。 根据我的经验,我可以从我的.htaccess
文件中抽出的越多,你就越快乐。 它调试起来更容易调试问题,并且更容易迭代更改而不会引入意想不到的后果。
解决方案2
您可以将PHP路由器与上面提供的.htaccess
文件结合使用,如下所示:
// Slim example
$app = new SlimSlim();
$app->get('/brandlisting/:key', function ($key) {
if (is_numeric($key)) {
$id = $key;
// call/run $id logic
} else {
$name = $key;
// call/run $name logic
}
});
// ...
$app->run();
如果你这样做,你可以从.htaccess
删除任何你的brandlisting
逻辑,并把它放到你的index.php
。
结论
如果您可以提供帮助,经验告诉我最好不要将您的应用程序逻辑写入.htaccess
规则。 相反,使你的.htaccess
规则简单并使用路由库。 如果您想使用.htaccess
,请确保您了解您正在使用的Apache重写标志,并且Apache从上到下读取所有内容。 例如,如果使用[L]
标志,Apache将停止读取规则集中的所有其他规则。 这意味着,您必须创建一个新的规则集,其中包含需要处理的其他规则,或者先制定更具体的规则。 请记住,如果这些规则具有[L]
标志,它们也将停止执行任何后续规则。
我从你现在的.htaccess
开始,你已经在一个单一的.htaccess
查找了所有满足你的需求的可用规则,例如规则为WordPress,它应该在你的wordpress安装目录中。
根据您的要求,您的规则应该是这样的,如果您尝试在根目录下,
RewriteEngine on
RewriteBase /mate/admin/
RewriteRule site/brandlisting/([d]+)/?$ site/brandlisting.php?id=$1 [L]
RewriteRule site/brandlisting/([a-zA-Z]+)/?$ site/brandlisting.php?name=$1 [L]
而对于WordPress的目录,你可以创建单独的.htaccess,你可以把你的规则index.php。
你可以在这里使用重定向。
假设你有以下文件夹:
<server root>/mate/admin
在mate / admin中放入.htaccess
RewriteBase /mate/admin/
RewriteRule "site/brandlisting/([^]+)/" "site/brandlisting?id=$1" [R,L]
RewriteRule "site/brandlisting/([^]+)" "site/brandlisting?id=$1" [R,L]
链接地址: http://www.djcxy.com/p/94755.html