Apache .htaccess-重定向多个页面

Apache .htaccess-重定向多个页面,apache,.htaccess,mod-rewrite,url-rewriting,Apache,.htaccess,Mod Rewrite,Url Rewriting,周末的大部分时间里,我都在绞尽脑汁,但我总是磕磕绊绊;我可以让服务器使用一组规则,但一次只能使用一组 我的申请由几页组成: 主页通过可选的查询字符串参数从详细信息页面(以及详细信息页面不包括的内容)中提取内容;e、 g.?s=项目名称 “详细信息”页面使用可选的查询字符串参数(与主页参数相同;例如,?s=项目名称——这将引用完全相同的内容)拉入内容 收藏页 相关页 每个页面都是文档根目录中的一个php文件(index.php、detail.php、collection.php、related

周末的大部分时间里,我都在绞尽脑汁,但我总是磕磕绊绊;我可以让服务器使用一组规则,但一次只能使用一组

我的申请由几页组成:

  • 主页通过可选的查询字符串参数从详细信息页面(以及详细信息页面不包括的内容)中提取内容;e、 g.
    ?s=项目名称
  • “详细信息”页面使用可选的查询字符串参数(与主页参数相同;例如,
    ?s=项目名称
    ——这将引用完全相同的内容)拉入内容
  • 收藏页
  • 相关页
每个页面都是文档根目录中的一个php文件(index.php、detail.php、collection.php、related 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
    而不是
    mydomain.com/detail.php?s=item name
    。所有页面都是这样,因此每次在一个页面上设置规则似乎相当麻烦
这就是我的.htaccess文件经过多次修改后目前的样子:

<IfModule mod_rewrite.c>  
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>

重新启动发动机
重写基/
重写cond%{REQUEST_FILENAME}!-f
重写cond%{REQUEST_FILENAME}!-d
重写规则^(.*)$index.php?s=$1[L]
这使得主页可以插入正确的内容,我相信这离允许任何页面也这样做不远,但我不能完全理解它

有人能帮忙吗

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]
说明:

  • 首先,我们检查完整的
    请求文件名是否不存在
  • 然后,我们检查格式是否如下:
    /
    (带有可选的尾部斜杠)
  • 然后检查第一个条件捕获是否作为PHP文件存在于文档根中。例如,如果我们请求
    foo/bar
    ,它将检查
    /foo.PHP
    是否存在
  • 然后,我们只需使用正确的查询字符串将请求路由到正确的文件
  • 因此,在您的情况下,当您请求
    detail/item name
    时,服务器实际上会查看
    detail.php?s=item name
    ,为您提供响应

    注意:如果它不存在,请求只需将请求发送到
    index.php

    编辑:添加了对根页面的检测。但是,请注意,我无法让它为这种检测留下斜杠,因为它会自动将
    .php
    修改为空的
    s
    查询参数。不确定为什么。。。
    这就是为什么当它达到这个阶段时,它会删除任何后面的斜杠。这对SEO评级/排名也有好处,因为它被视为一个页面,而不是两个重复的页面。

    我认为非常接近,但目前请求detail.php(
    mydomain.com/detail
    )正在被解释为index.php/?s=detail.miss,抱歉。请稍等片刻。非常接近…但这会削弱对js和css文件的调用…-\u-这可能与我在页面标题中引用它们的方式有关…
    href=“/\u includes/css/main.css”
    ?我明白了-只是在我这边测试了一下,你是对的-它确实把事情搞砸了。我会很快解决的。