如何在 .htaccess 中创建别名以直观地隐藏 URL 的目录路径

Posted

技术标签:

【中文标题】如何在 .htaccess 中创建别名以直观地隐藏 URL 的目录路径【英文标题】:How to make an alias in .htaccess to hide visually the directory path of the URL 【发布时间】:2022-01-22 08:13:51 【问题描述】:

我很确定这是重复的,但我只是不知道如何找到这个简单问题的答案。

所以我有这个本地页面 - WP 页面:https://localhost/mrdigital/alias-links-pdf/

下面的代码是模型 - 用于 /alias-links-pdf/ 页面的模板文件。

在模板文件中有两个链接。单击下载时,这两个链接都会生成两个不同的 PDF 文件。 (一个带参数的文件,另一个不带参数的文件)

<?php
if ( ! defined( 'ABSPATH' ) ) 
    exit; // Exit if accessed directly.


get_header(); ?>

<?php the_title(); ?>

<?php if (have_posts()) : while(have_posts()) : the_post(); ?>

<?php the_content(); ?>

<?php endwhile; endif; ?>

    <section>

        <div class="page_book_title">
            Book Genres - What Kinds of Books Are There?<br>
            There are very different types of books - Let's tell you which ones!
        </div>

        <div class="page_book_pdf">
        <ul>
            <li><a href="https://localhost/mrdigital/wp-content/themes/astra-child/pdf.php?key=1360">PDF One </a></li>
            <li><a href="https://localhost/mrdigital/wp-content/themes/astra-child/pdf.php">PDF Two</a></li>
        </ul>
        </div>

    </section>

<?php get_footer(); ?>

我需要为两个链接或两个 URL 创建一个别名,因为当鼠标悬停时,它会显示整个文件目录。该文件夹已暴露,这是不希望的。

我需要使用这样的东西,所以当用户悬停指针时,我们会看到一个别名。 这也是一个 url 路由。https://localhost/mrdigital/items/

然后我尝试在 .htaccess 中使用以下行,但代码有问题。页面进入循环。

# BEGIN Code
RewriteRule ^mrdigital/pdf-one$ wp-content/themes/astra-child/pdf.php?key=1360 [L]
RewriteRule ^mrdigital/pdf-two$ wp-content/themes/astra-child/pdf.php [QSD,L]


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
RewriteBase /mrdigital/
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /mrdigital/index.php [L] 
RewriteRule ^(.*)$ /mrdigital/wp-content/themes/astra-child/page-aliasurl.php?url=$1 [QSA,L]
</IfModule>

这个别名的最简单方法应该是什么?

甚至可以对同一个 .htaccess 文件中的两个不同文件进行重写吗?

感谢任何帮助。

【问题讨论】:

您的.htaccess 文件在哪里?是在文档根目录下,还是在/mrdigital子目录下? 您好@MrWhite,非常感谢您的帮助!我会做修改,我给你一个反馈。这是文件路径。 C:\xampppserver\htdocs\mrdigital\.htaccess 我再次编辑了问题中的代码块(.htaccess 块),所以你可以看到我是如何使用它的。 【参考方案1】:
RewriteRule ^(.*)$ /mrdigital/wp-content/themes/astra-child/page-aliasurl.php?url=$1 [QSA,L]

这会无条件地将映射到文件(或目录)的所有内容重写为page-aliasurl.php - 所以是的,这会破坏所有内容。像这样的规则也在错误的地方——它需要在重写到前端控制器之前进行。 (但是,page-aliasurl.php 是什么?您的问题中没有提到这一点。)

这样试试吧……

<li><a href="https://localhost/mrdigital/wp-content/themes/astra-child/pdf.php?key=1360">PDF One </a></li>
<li><a href="https://localhost/mrdigital/wp-content/themes/astra-child/pdf.php">PDF Two</a></li>

更改您的锚点,使它们链接到您的两个 PDF 的所需规范 URL。例如:

<li><a href="https://localhost/mrdigital/pdf-one">PDF One </a></li>
<li><a href="https://localhost/mrdigital/pdf-two">PDF Two</a></li>

/mrdigital/pdf-one/mrdigital/pdf-two 不应该是 WordPress 中的路由 - 如果是,它们无论如何都会被覆盖。如果您使用.htaccess 执行此重写,那么这将在 WordPress 之外运行。

然后在您的 root .htaccess 文件的顶部创建以下重写,在现有指令之前。例如:

RewriteRule ^mrdigital/pdf-one$ wp-content/themes/astra-child/pdf.php?key=1360 [L]
RewriteRule ^mrdigital/pdf-two$ wp-content/themes/astra-child/pdf.php [QSD,L]

这使用文件后面已经设置的RewriteBase /mrdigital/ 指令。

第一条规则在内部将请求从/mrdigital/pdf-one 重写为/mrdigital/wp-content/themes/astra-child/pdf.php?key=1360,从/mrdigital/pdf-two 重写为/mrdigital/wp-content/themes/astra-child/pdf.php(无URL 参数)。第二条规则上的QSD(查询字符串丢弃)标志仅确保无法通过请求/mrdigital/pdf-two?key=1360访问第一个PDF。

但是,如果您的 .htaccess 文件位于 /mrdigital 子目录(不是文档根目录)中,则删除以上两者的 RewriteRule 上的 mrdigial/ 前缀 pattern规则。


旁白:

RewriteRule ^index\.php$ - [L]

如果您的 .htaccess 文件位于文档根目录中,那么您应该将上述指令更改为:

RewriteRule ^mrdigital/index\.php$ - [L]

更新:

这是文件路径。 C:\xampppserver\htdocs\mrdigital\.htaccess

由于.htaccess文件位于/mrdigital子目录中,那么如上所述,您需要“删除两个规则的RewriteRule上的mrdigial/前缀模式” .

总而言之,您的代码应如下所示:

(虽然如果这是 WordPress,那么您应该避免在 WordPress 代码块之间编辑代码。)

# Rewrite specific PDF documents
RewriteRule ^pdf-one$ wp-content/themes/astra-child/pdf.php?key=1360 [L]
RewriteRule ^pdf-two$ wp-content/themes/astra-child/pdf.php [QSD,L]

# BEGIN Code
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]
#RewriteBase /mrdigital/
RewriteRule ^index\.php$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . index.php [L] 

# I do not know what this is trying to do?
# It is certainly incorrect in its format and placement in the file.
#RewriteRule ^(.*)$ /mrdigital/wp-content/themes/astra-child/page-aliasurl.php?url=$1 [QSA,L]
</IfModule>

注意:我注释掉了 RewriteBase 指令 - 如果 .htaccess 文件本身位于 /mrdigital 子目录中,则不需要它。我还删除了 RewriteRule substitution 字符串上的 /mrdigital/ 前缀 - 同样,如果 .htaccess 文件位于子目录中,则不需要这样做。

【讨论】:

你好@mrwhite,我已经编辑了我的问题。然而,page-aliasurl.php 是什么?你在你的问题中没有提到这个 :: 回答:这是模型 - 用于 /alias-links-pdf/ 页面的模板文件 好吧,我做了修改。 :: 1° - 我将这两行放在 .htaccess 文件的开头 :: RewriteRule ^mrdigital/pdf-one$ wp-content/themes/astra-child/pdf.php?key=1360 [L] : : RewriteRule ^mrdigital/pdf-two$ wp-content/themes/astra-child/pdf.php [QSD,L] 2° - 我试图访问浏览器中的文件,就好像它们是一条路线一样,但我得到了 404 错误页面。 :: localhost/mrdigital/pdf-one :: localhost/mrdigital/pdf-two :: 此页面不存在。 3° - 为了确保这些行很重要,我评论了这些行并测试了每一行。 :: RewriteRule ^index\.php$ - [L] :: RewriteRule 。 /mrdigital/index.php [L] :: 但是当我点击页面链接时 PDF One :: PDF 二 :: 我得到了 404 页面。 :: 本页面不存在。请问我现在应该尝试什么? @TobitheDev 请注意,我在答案的底部声明:“但是,如果您的 .htaccess 文件位于 /mrdigital 子目录(不是文档根目录)中,则删除 @987654361上述规则的RewriteRule 模式上的@ 前缀。” - 从您对问题的评论看来,您的 .htaccess 确实在 /mrdigital 子目录中,因此您需要相应地更新这两个规则。但是关于page-aliasurl.php 的最后一条规则没有多大意义?

以上是关于如何在 .htaccess 中创建别名以直观地隐藏 URL 的目录路径的主要内容,如果未能解决你的问题,请参考以下文章

如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?

如何在 Xamarin Forms 中创建隐藏溢出

如何在 MySQL 中创建表别名

如何在 java 中创建一些东西来根据纵横比调整图像的大小和位置? [关闭]

如何在 Windows/Mac/Linux 中创建隐藏文件?

如何在 Apache Tomcat 中创建“别名”?