.htaccess 使用htaccess,我如何重写规则/重写条件没有文件名?

xggvc2p6  于 2023-02-24  发布在  其他
关注(0)|答案(2)|浏览(144)

希望这不是一个重复的,做了很多的寻找,我只是得到更多的困惑,因为我不经常使用.htaccess
我想有一些漂亮的网址,并看到很多关于获取信息的帮助,例如index.php被传递了一个参数,如page。所以我现在可以转换www.example.com/index.php?page=helpwww.example.com/help
显然,我不知道这一点,但我想解析一个URL,如www.example.com/?page=help
似乎找不到太多的信息和适应原来的我显然是走错了地方。
任何帮助或正确方向的指针将不胜感激。我敢肯定,这可能是愚蠢的简单。
到目前为止,我的修改似乎没有工作是:

RewriteCond %{THE_REQUEST} ^.*/?page=$1
RewriteRule ^(.*)/+page$ /$1[QSA,L]

最近也尝试了QUERY_STRING,但只是得到服务器错误。

RewriteCond %{QUERY_STRING} ^page=([a-zA-Z]*)
RewriteRule ^(.*) /$1 [QSA,L]

放弃了对世界的死亡,所以我想我会问。希望确保请求/url等启动?page,并希望从page参数中创建一个干净的URL。

8wtpewkr

8wtpewkr1#

这是整个/基本过程......

1. HTML源代码

确保链接到HTML源中的“pretty/canonical”URL。这应该是以斜杠开头的相对于根目录的URL(或绝对URL),以防以后从不同的URL路径深度重写。例如:

<a href="/help">Help Page</a>

2.重写“漂亮”URL

.htaccess中(使用mod_rewrite),在内部将“pretty”URL重写回实际处理请求的文件,即“front-controller”(例如index.php,如果需要,可以传递page URL参数)。

DirectoryIndex index.php

RewriteEngine On

# Rewrite URL of the form "/help" to "index.php?page=help"
RewriteRule ^[^.]+$ index.php?page=$0 [L]

RewriteRulepattern^[^.]+$匹配任何不包含点的URL路径。通过排除点,我们可以轻松地忽略任何Map到物理文件(包括由点分隔的文件扩展名)的请求。
$0反向引用包含与RewriteRule * 模式 * 匹配的完整URL路径。
DirectoryIndex在请求“主页”(根目录)时是必需的,而URL路径在其他情况下为 * 空 *。在这种情况下,page URL参数不会传递给我们的脚本。

3.实施前端控制器/路由器(即index.php

index.php(您的“前端控制器”/路由器)中,我们读取page URL参数并提供适当的内容。

<?php
$pages = [
    'home' => '/content/homepage.php',
    'help' => '/content/help-page.php',
    'about' => '/content/about-page.php',
    '404' => '/content/404.php',
];

// Default to "home" if "page" URL param is omitted or is empty
$page = empty($_GET['page']) ? 'home' : $_GET['page'];

// Default to 404 "page" if not found in the array/DB of pages
$handler = $pages[$page] ?? $pages['404'];
include($_SERVER['DOCUMENT_ROOT'].$handler);

如上面的脚本所示,实际的“内容”存储在/content子目录中(也可以是文档根目录之外的位置)。通过将这些文件存储在单独的目录中,可以很容易地防止直接访问它们。

4.将“旧/丑”URL重定向到“新/漂亮”URL [可选]

只有当您正在 * 更改 * 一个现有的URL结构并且“旧/丑”(原始)URL已经暴露(被搜索引擎索引,被第三方链接等)时,这才是绝对必要的(为了保护SEO),否则“旧”URL(即/index.php?page=abc)是可访问的。
如果网站是新的,并且您从一开始就实现了“新/漂亮”的URL,那么这就不那么重要了,但它确实可以防止用户访问旧的URL,如果他们曾经暴露/猜测。
以下代码将在内部重写之前和RewriteEngine指令之后执行。

# Redirect "old" URL of the form "/index.php?page=help" to "/help"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} ^/index\.php$ [OR]
RewriteCond %{QUERY_STRING} ^page=([^.&]*)
RewriteRule ^(index\.php)?$ /%1 [R=301,L]

REDIRECT_STATUS环境变量的检查通过不重定向已被稍后的重写所重写的请求来防止重定向循环。
%1反向引用包含page URL参数的值,该参数是从前面的 CondPatternRewriteCond指令)中捕获的(注意这与上面重写中使用的$n反向引用有何不同)。
上面的命令重定向所有URL变量,包括使用/不使用index.php以及使用/不使用page URL参数。例如:

  • /index.php?page=help -〉/help
  • x1米24英寸1x-〉x1米25英寸1x
  • /index.php-〉/(主页)
  • /?page=-〉/(主页)

提示:首先测试302(临时)重定向,以防止潜在的缓存问题。

读者评论/改进/练习

  • 以上代码不处理附加的URL参数。您可以在初始重写时使用QSA(查询字符串附加)标志,以便在初始请求的URL上附加附加的URL参数。但是,实现反向重定向并不是那么简单。
  • 您不需要在重写中传递page URL参数。(原始)URL在PHP超级全局$_SERVER['REQUEST_URI']中可用(还包括查询字符串-如果有)。然后,您可以解析此变量以提取URL的所需部分,而不是依赖于page URL参数。这通常具有最大的灵活性,而不必稍后修改.htaccess

但是,如果您希望使用.htaccess手动重写(覆盖)URL路由,则能够传递page URL参数可能会非常“有用”。

  • 在“路由器”脚本中加入正则表达式(通配符模式匹配),这样你就可以生成带有“参数”的URL。例如/<page>/<param1>/<param2>/photo/cat/large

参考:

cx6n0qe3

cx6n0qe32#

RewriteCond %{QUERY_STRING} ^page=([^&]+)
RewriteRule ^$ /%1? [R=302,L]

不能删除,不想浪费任何人的时间作出回应。

相关问题