为啥我的 .htaccess 代码不能完美地用于漂亮的 URL

Posted

技术标签:

【中文标题】为啥我的 .htaccess 代码不能完美地用于漂亮的 URL【英文标题】:Why is my .htaccess code not working perfectly for pretty URL为什么我的 .htaccess 代码不能完美地用于漂亮的 URL 【发布时间】:2019-06-20 14:30:20 【问题描述】:

我正在使用以下 .htaccess 代码制作漂亮的 url。

# code to make pretty URLS | we're using this code to achieve /category/slug
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ app/post.php?&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ app/post.php?category=$2 [L]

当我 print_r($_GET) 我得到以下输出

我的网址参数是http://www.exanple.com/usage-tips

Array ( [category] => usage-tips)

但是这个类别下的帖子太多了,所以我还必须从分页器中添加页码。

所以现在我的 URL 参数是http://www.exanple.com/usage-tips/2

Array ( [category] => productivity [slug] => 2 )

print_r($_GET) 显示了一个带有slug 的新参数,我希望该参数为page,因为基于此我将提取变量并相应地设置分页器。我不知道如何实现它。

另外,还有一个问题。假设我有 29 个帖子,在每个页面上,我限制了 6 个帖子。

我目前正在使用此 URL 参数 www.example.com/?page=2,因为如果我使用此 www.example.com/2,那么它会将变量 2 纳入类别

谁能帮我解释一下逻辑,我哪里错了?

【问题讨论】:

【参考方案1】:

您的问题是,没有给出第二个参数是作为页码还是作为 slug 的信息。没有信息就无法判断,您无法通过实施重写规则直接做任何事情。

此外,您似乎在捕获计数方面存在一次性问题,但这可能是您在此处发布的示例的一些简化的结果,因此我将针对此处的具体示例进行修复,但不会对此进行更多的 cmets .您将需要根据您在现实生活中的(可能不同的)情况调整给定的解决方案。

不过,有一些解决方法。您可以将用于该分页的 URL 模式更改为 http://www.example.com/usage-tips/page/2,然后很容易匹配该模式:

RewriteEngine on

# http://www.example.com/usage-tips/page/2
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?(.+)/page/([\d]+)$ app/post.php?&category=$1&page=$2 [END,QSA]

# http://www.exanple.com/usage-tips/some-usage-tip
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?([\w-]+)/([\w-]+)$ app/post.php?category=$1&slug=$2 [END,QSA]

# http://www.exanple.com/usage-tips
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category=$1 [END,QSA]

或者,也许你可以定义任何第二个参数,如果给定一个纯数值,则被认为是页码,而其他所有参数都被认为是 slug:

RewriteEngine on

# http://www.example.com/usage-tips/2
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?(.+)/([\d]+)$ app/post.php?&category=$1&page=$2 [END,QSA]

# http://www.exanple.com/usage-tips/some-usage-tip
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?([\w-]+)/([\w-]+)$ app/post.php?category=$1&slug=$2 [END,QSA]

# http://www.exanple.com/usage-tips
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^/?([\w-]+)$ app/post.php?category=$1 [END,QSA]

这些修改后的规则集同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。

对此的一般性评论:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

您的代码在第 1 期中完美运行,但对于像 www.example.com/?page=2 这样的第二期,它仍在考虑 category 中的 page=2 我根据您的指导修改了代码,也解决了这个问题。 我做了一些修改,还为第一个建议明确添加了第二个规则集。 很高兴听到您可以找到适合您具体情况的有效解决方案!

以上是关于为啥我的 .htaccess 代码不能完美地用于漂亮的 URL的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 React 应用程序不能使用我的 Apache .htaccess 文件来防止 404?

在 ruby​​ on rails 动态 id 不能用于两个词,但可以完美地用于一个词——使用引导程序崩溃

为啥这段代码可以在 Linux 上运行,但不能在 Windows 上运行?

Http Auth 不适用于 PHP

为啥我的代码不能在 web 中的 react-native 代码中运行

为啥我不能更改表格页脚的文本颜色?