2

我正在我的 htaccess 中寻找一些帮助,以便在使用分页功能时更好地处理我的 url。

目前我的 htaccess 看起来像这样:

RewriteEngine On RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  

基本上,我有两个规则。起初我只有第二个,将所有请求定向到我的索引页面,然后我解析出 url 的一些细节以显示正确的内容。我发现它不适用于只有一个子目录的 url,比如 example.com/bars,但只有两个目录,比如 example.com/bars/bar-name,所以我在它之前添加了规则。

这对我来说效果很好。我所有的 url 看起来都很棒,并且 ?alias=bars/bars-name 已完全隐藏,现在看起来像 /bars/bars-name

最近虽然我集成了一个分页php功能。此函数创建如下所示的 url:

example.com/bars?alias=bars&info=mysql_table_bars&page=2

基本上,'info' 是分页函数查询的表名,'page' 是当前页面。一旦我开始使用此功能,似乎“别名”也开始显示在 url 中。

我希望我的分页看起来像这些例子:

example.com/bars/page/2
example.com/hotels/page/5
etc...

我需要在我的 htaccess 中添加什么来处理这种情况?另外,有没有办法简化我现有的两条规则?

4

1 回答 1

2

关于你原来的规则。您仅适用于紧随其后的条件RewriteRule,因此您需要复制它们:

RewriteEngine On 
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/?$    index.php?alias=$1    [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule    ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$    index.php?alias=$1/$2    [QSA,NC,L]  

对于新的分页内容,首先,从查询字符串中提取数据库表名真的很糟糕,除非它们已经以某种方式得到验证(这可能是正在发生的事情)。但即便如此,这仍然是一个信息披露问题。因此,您可以使用这些规则来始终删除它们:

# This matches the actual request when there's pagination in the query string
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/\?]+)\?alias=([^&\ ]+)&info=.*&page=([0-9]+)

# an optional sanity check, does the request URI match the "alias" param?
RewriteCond %1:%2:%3 ^(.*):\1:(.*)$

# redirect the browser to the URL with the table name removed
RewriteRule ^ /%1/page/%2? [L,R=301]

然后,您需要使用查询字符串在内部将它们重写回请求的规则:

# rewrite it back to the query string
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/page/([0-9]+) /$1?alias=$1&info=mysql_table_$1&page=$2 [L]
于 2012-10-26T19:00:37.280 回答