如何将字符串转换为slug?

Som*_*ial 5 php security wordpress .htaccess mod-rewrite

赏金注意:我已经使用add_rewrite_rules找到了我的问题解决方案.我将奖励那些能够以apache RewriteRules格式为我提供相同解决方案的人.

我已经阅读了如何使用.htaccess创建友好的URL?但它仍然很困难,也很复杂.

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

我有一个网址如下:

http://cp.example.com/sales.php?id=12345&userid=123456&uid=83hkuhdqhuhd873xsuhdqwiuhdiq
Run Code Online (Sandbox Code Playgroud)

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

http://cp.example.com/sales/12345/userid/123456/83hkuhdqhuhd873xsuhdqwiuhdiq
Run Code Online (Sandbox Code Playgroud)

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

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

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

我试图避免使用自定义帖子类型只是为了实现上述目的.

我尝试了以下内容.

  1. 在view_sales.php中创建一个模板文件view_sales.php我将要求$_GET['id'],$_GET['userid']$_GET['uid']从mysql中检索信息.

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

  3. 在header-sales.php中,我添加了以下来自上面的堆栈溢出页面的代码.

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

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

    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>  
    
    Run Code Online (Sandbox Code Playgroud)

目前没有任何工作,仍然重定向到丑陋的网址.

编辑:

我尝试了以下内容

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]
Run Code Online (Sandbox Code Playgroud)

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

编辑我试过的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');
Run Code Online (Sandbox Code Playgroud)

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

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

访问index.php可以工作,但转到/ listing/test/failed.它返回404错误.

Som*_*ial 1

终于解决了困扰我几天的问题。

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

如果你想改变

http://子域名.example.com/listing? 操作=添加(例如或DEL或VIEW)

WordPress 多站点的

http://子域名.example.com/ add/(例如 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');
Run Code Online (Sandbox Code Playgroud)

完成后,您将能够访问 http:// subdomain .example.com/listing/ add

在您的页面中(在本例中,我的页面名称是“listing”),您将不再收到 404 错误,并且可以通过使用获取“action”的值(在本例中为 Add/Del/View)

    http://subdomain.example.com/listing/**add**
    $a = get_query_var('action');
    echo $a; //prints **add**
Run Code Online (Sandbox Code Playgroud)

注意:您无法像 RewriteRule 那样使用 $_GET 获取操作的值,但这应该能够完成大多数事情。

我可以继续研究 WordPress 并获得所有自定义的漂亮链接,并扔掉我最后 3 天探索 Laravel 和 Symfony3 的工作。感谢上帝。