在周末的大部分时间里,我一直试图绕过.htaccess,但我一直在磕磕绊绊;我可以让服务器使用一组规则,但一次不能超过一个。
我的申请由几页组成:
?s=item-name
?s=item-name
- 这将引用完全相同的内容)这些页面中的每一个都是文档根目录中的php文件(index.php,detail.php,collection.php,相关的php)。
我想要实现的目标:
mydomain.com/detail/
或mydomain.com/detail
(因此允许使用尾随斜杠)而不是mydomain.com/details.php
?s=item-name
)(mydomain.com/item-name
而不是mydomain.com/?s=item-name
; mydomain.com/detail/item-name
而不是{{1所有页面都是这种情况,因此一次在一个页面上设置规则似乎相当麻烦...... 这是我的.htaccess文件目前的样子,经过多次摆弄:
mydomain.com/detail.php?s=item-name
这允许主页提取正确的内容,我确信它不会让任何页面做同样的事情,但我无法理解它。
有人可以帮忙吗?
答案 0 :(得分:1)
RewriteEngine On
RewriteBase /
# Specifics
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ %1.php?s=%2 [L]
# EDIT 1: This will also check for root pages. See notes below
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+)/ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.+) $1.php [L,QSA]
# Everything else
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L]
<强>解释强>
REQUEST_FILENAME
是否存在。/<something-without-slash>/<everything else>
(带有可选的尾部斜杠)。foo/bar
,则会检查/foo.php
是否存在。因此,在您的情况下,当您请求detail/item-name
时,服务器实际上会查看detail.php?s=item-name
以向您提供回复。
注意:如果它不存在,请求只会将请求发送到index.php
。
编辑已添加对根页面的检测。但请注意,我无法为此类检测留下斜线,因为它会自动将.php
修改为空s
查询参数。不知道为什么......
这就是为什么当它到达这个阶段时,它将删除任何尾部斜杠。这对SEO评级/排名也有好处,因为它被视为一页,而不是两个重复。