如何在 .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 中创建类型别名?
如何在 java 中创建一些东西来根据纵横比调整图像的大小和位置? [关闭]