为啥我的 .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 上运行?