为什么我的.htaccess代码不适用于漂亮的URL

时间:2019-01-27 11:20:54

标签: php .htaccess friendly-url pretty-urls

我正在使用以下.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)时,我得到以下输出

我的URL参数是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 个答案:

答案 0 :(得分:2)

您的问题是,没有给定第二个参数是页码还是段信息的信息。没有信息就无从谈起,您无法通过实施重写规则直接做什么。

您似乎也对捕获计数有一个一次性的问题,但这可能是由于简化了此处发布的示例而导致的,因此我将在此处针对特定示例进行修复,但不对此做更多评论。您将需要根据给定的解决方案适应现实生活中(可能不同)的情况。

但是有解决方法。您可以将用于该分页的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]

或者,也许您可​​以定义任何给定的包含纯数字值的第二个参数都将被视为页码,而其他所有参数均被视为无用信息:

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服务器主机配置(阅读:真正便宜的服务提供商)或坚持编写自己的规则的应用程序(这显然是安全的噩梦)时,才提供它们作为最后的选择。