如何制作从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

    上一篇: how to make a htaccess rule from id to name

    下一篇: Python wheels: cp27mu not supported