在 htaccess 中使用 rewriterule 的页面 slug

Posted

技术标签:

【中文标题】在 htaccess 中使用 rewriterule 的页面 slug【英文标题】:page slug with rewriterule in htaccess 【发布时间】:2015-02-24 02:32:12 【问题描述】:

我在 htaccess 中使用 Rewrite Rule 来通过 slug 获取页面数据。

我是通过在 .htaccess 中添加行来手动完成的:

RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %HTTP_HOST !www\.example\.co\.il$ [NC]
RewriteRule ^(.*)$ http://www.example.co.il/$1 [L,R=301]
ErrorDocument 404 /404.php
RewriteRule ^עמוד-מסוים$ /page.php?id=1 [L]
RewriteRule ^דוגמא-לעמוד$ /page.php?id=2 [L]
RewriteRule ^דוגמא-נוספת$ /page.php?id=3 [L]
RewriteRule ^טקסט-כלשהו$ /page.php?id=4 [L]
RewriteRule ^צרו-קשר$ /contact.php [L]
RewriteRule ^blog$ /blog.php [L]

效果很好,但我每次都需要添加新的 .htaccess 行。

我的数据库表有 Id 和 Slug(以及其他信息) 我的 page.php 使用 $_GET['id'] 然后通过这个 ID 从 DB 中选择其他数据。

我尝试过这样的事情:

.htaccess:

RewriteRule ^page/([^/]*)$ /page.php?id=$1 [L]

page.php:

$id=$_GET['id'];

    if(is_int($id)==false) // if slug was enterd
        $result=$mysqli->query("SELECT `id` FROM `pages` WHERE  `slug`='$id' limit 1");
        while($row=mysqli_fetch_assoc($result))
            $id=$row['id'];
        //query
    

但 URL 看起来不像我想要的(将 /page/ 添加到 url)

我也试过了:

.htaccess:

RewriteRule ^/([^/]*)$ /page.php?id=$1 [L]

但是我网站上的其他 url 有问题(没有连接到 page.php)

如何在不每次都添加 htaccess 行的情况下使其工作?

编辑: 当我尝试这个 .htaccess 时:

RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %HTTP_HOST !www\.example\.co\.il$ [NC]
RewriteRule ^(.*)$ http://www.example.co.il/$1 [L,R=301]
ErrorDocument 404 /404.php
RewriteRule ^/?([^/]+)$ /page.php?id=$1 [L]
RewriteRule ^צרו-קשר$ /contact.php [L]
RewriteRule ^blog$ /blog.php [L]

我在所有页面上都出现错误,如果我向上移动 RewriteRule ^/?([^/]+)$ /page.php?id=$1 [L] 只有 page.php 文件可以正常工作(博客和联系方式无效),非 WWW 网址也无效。

【问题讨论】:

【参考方案1】:

您可以尝试添加一些条件,例如:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?([^/]+)$ /page.php?id=$1 [L]

过滤掉所有现有的文件和目录。

另外,您可能需要考虑sanitizing your $id parameter before you stick it in a query

【讨论】:

尝试此操作时出现内部服务器错误。 内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。请联系服务器管理员 webmaster@example.co.il 并告知他们错误发生的时间,以及您所做的任何可能导致错误的事情。服务器错误日志中可能提供有关此错误的更多信息。此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。 Apache 服务器位于 www.example.co.il 端口 80 我发现了问题,但我不知道如何解决。我在你给我的那一行之前有这些行: RewriteCond %HTTP_HOST !www\.example\.co\.il$ [NC] RewriteRule ^(.*)$ example.co.il/$1 [L,R=301] If I删除它们我没有收到错误 @itay 您需要在 重定向规则之后放置任何路由规则,因此这些需要放在最后。您需要查看服务器日志,而不是浏览器中的错误消息。 我的错误。这不是很好。如果我将 HTTP_HOST 移动到底部,它适用于 page.php,但对于不在 page.php 中的其他文件会出现问题,并且如果在没有 WWW 的情况下键入 url 就会出现问题......所以它没有解决..【参考方案2】:

找到灵魂。这工作完美:

ErrorDocument 404 /404.php 
RewriteEngine On

RewriteCond %HTTP_HOST !^www\. [NC]
RewriteRule ^(.*)$ http://www.%HTTP_HOST/$1 [R=301,L]

RewriteRule ^צרו-קשר$ /contact.php [L]

RewriteCond %REQUEST_FILENAME !-f 
RewriteCond %REQUEST_FILENAME !-d 
RewriteRule ^/?([^/]+)$ /page.php?id=$1 [L]

【讨论】:

以上是关于在 htaccess 中使用 rewriterule 的页面 slug的主要内容,如果未能解决你的问题,请参考以下文章

强制 RewriteRule 在 htaccess 文件中结束处理/循环

.htaccess 中的 RewriteRule 在 app.yaml 文件中转换为啥?

.htaccess 与 EasyPHP:RewriteRule 不起作用

htaccess Apache RewriteRule .asp 到 .php

.htaccess 重定向到 404 页面 RewriteRule

.htaccess & WordPress:从 RewriteRule 中排除文件夹