如何将字符串转换为slug?

时间:2016-04-30 16:00:13

标签: php wordpress .htaccess security mod-rewrite

Bounty注意:我使用add_rewrite_rules找到了我的问题解决方案。我会奖励任何能够以apache RewriteRules格式向我提供相同解决方案的人。

我读过How can I create friendly URLs with .htaccess?,但这对我来说仍然很困难并且很复杂。

我正在运行WordPress Multisite,我有一个子域名网站cp.example.com,我正在这个子域名上编写一个php应用程序。

我的网址是这样的:

http://cp.example.com/sales.php?id=12345&userid=123456&uid=83hkuhdqhuhd873xsuhdqwiuhdiq

我是否可以通过以下方式让用户访问网站:

http://cp.example.com/sales/12345/userid/123456/83hkuhdqhuhd873xsuhdqwiuhdiq

如果我这样做,那么php仍然能够对值进行$_GET吗?

例如$_GET['id']$_GET['userid']$_GET['uid']

我正在使用WordPress作为我的基础,但我正在编写应用程序结束,使用不同的表。

我试图避免使用自定义帖子类型来实现上述目标。

我尝试了以下内容。

  1. 在view_sales.php中创建模板文件view_sales.php我需要$_GET['id']$_GET['userid']$_GET['uid']才能从mysql中检索信息。

    < / LI> {li>

    view_sales.php我还使用了不同的头文件并get_header('sales');

  2. header-sales.php中的
  3. 我已经从上面的堆栈溢出页面添加了以下代码。

    $path_components = explode('/', $_GET['url']);
    $id=$path_components[0];
    $userid=$path_components[1];
    $uid=$path_components[2];
    
  4. 我创建了一个带有slug销售的新wp页面,所以现在网站是 http://cp.example.com/sales/?id=123456&userid=123456&token=98917397219372iheu1i

  5. 我的.htacess域中只有一个/public_html/example.com网站,因为它是多站点,因此我将上面建议的代码添加到我的.htaccess,现在看起来像这样。< / p>

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    
    # add a trailing slash to /wp-admin
    RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^ - [L]
    RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
    RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
    RewriteRule . index.php [L]
    
    <IfModule mod_rewrite.c>
     RewriteEngine On
     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>  
    
  6. 目前没有任何工作,仍然会重定向到丑陋的网址。

    编辑:

    我尝试了以下

    RewriteCond %{HTTP_HOST} !^cp\.example\.com [NC]
    RewriteRule ^listing/([a-z0-9]+)$ listing/?action=$1 [L,NC] 
    RewriteRule ^view/([a-z9-9]+)$ view/?id=$ [L,NC]
    

    我尝试了以上所有的不同变体但没有任何作用。

    编辑了我尝试的add_rewrite_rule方法

    function pa_custom_rules() {
        add_rewrite_rule('^/listing/([^/]+)/$', 'index.php?pagename=listing&action=$matches[1]', 'top');
    }
    add_action('init', 'pa_custom_rules');
    

    打印重写数组,我可以看到新规则

          [^/listing/([^/]+)/$] => index.php?pagename=listing&action=$matches[1]
    

    访问index.php有效,但转到/ listing / test /失败。它返回404错误。

2 个答案:

答案 0 :(得分:1)

最后解决了最近困扰我的问题。

看起来特定域的重写规则不起作用。

如果您想更改

  

http:// 子域名 .example.com / listing? action = add (例如。或DEL或VIEW)

Wordpress MULTISITE

  

http:// 子域 .example.com / 添加/ (例如,或DEL或VIEW)

您必须不仅添加重写规则,而且还必须将标记重写/添加到 query_var

您需要添加以下功能或创建一个插件才能启动它。

function pa_custom_rules() {
    add_rewrite_rule('listing/(.*)$', 'index.php?pagename=listing&action=$matches[1]', 'top');
   add_rewrite_tag('%action%', '(.*)');
}
add_action('init', 'pa_custom_rules');

完成后,您将可以访问http:// 子域 .example.com / listing / 添加

在您的页面中(在这种情况下,我的页面名称为&#39;列出&#39;),您将不再收到404错误,并且您可以获得&#34; action&#34;的值(使用

添加/删除/查看)
    http://subdomain.example.com/listing/**add**
    $a = get_query_var('action');
    echo $a; //prints **add**

注意:不能使用$ _GET获取操作的值,就像RewriteRule的工作方式一样,但这应该可以完成大部分工作。

我可以继续使用wordpress并获得我所有自定义的美丽链接,并抛弃我最近3天的工作,探索Laravel和Symfony3。感谢上帝。

答案 1 :(得分:0)

  

我有一个像这样的网站

 http://cp.example.com/sales.php?id=12345&userid=123456&uid=83hkuhdqhuhd873xsuhdqwiuhdiq
     

我是否可以让用户通过

访问该网站
 http://cp.example.com/sales/12345/userid/123456/83hkuhdqhuhd873xsuhdqwiuhdiq

是的,它可能,例如:

RewriteEngine On
RewriteRule ^sales/(\d+)/userid/(\d+)/([a-z0-8]+)$ sales.php?id=$1&userid=$2&uid=$3 [L,NC]
  

如果我这样做的话...... php仍然可以在这上面做$ _GET   值?

     

例如$ _GET [&#39; id&#39;],$ _GET [&#39; userid&#39;]和$ _GET [&#39; uid&#39;]

是的,当然php可以做到这一点。