.htaccess xampp rewrite mod的重定向提供完整的目录地址

yfjy0ee7  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(135)

我是新的整个apache配置,我有一个问题,我似乎不能找到一个解决方案,在谷歌。

简而言之我无法在URL中隐藏文件夹,因为看起来文档根字符(^)好像从XAMPP安装文件夹的开头开始-/opt/lampp/htdocs/batulabe/
详细信息我在Mac上安装了一个全新的XAMPP VM,没有进行过多配置,所以一切基本上都是默认的。这是网站当前的文件夹布局:

-batulabe (the document root I intend to make, this folder is inside htdocs)
--public
---pages
----*php pages
--private
---*private, inaccessible files

我正在尝试重写URL,如:

http://localhost/batulabe/public/pages/varpage.php

http://localhost/batulabe/varpage

我得到结果

http://my_ipv4_address/opt/lampp/htdocs/batulabe/public/pages/public/pages/account.php.php

我创建了一个额外的.conf文件website.conf,并通过写一行类似于Include "/opt/lampp/apache2/conf/website.conf"的代码让Apache读取它。除此之外,我只修改了以下文件(.conf):
-httpd.conf

Alias /bitnami/ "/opt/lampp/apache2/htdocs/"
Alias /bitnami "/opt/lampp/apache2/htdocs"

<Directory "/opt/lampp/apache2/htdocs">
    Options Indexes FollowSymLinks
    LoadModule rewrite_module modules/mod_rewrite.so
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

-website.conf(我为Apache读取而创建的相同的额外配置文件)

<Directory "/opt/lampp/htdocs/batulabe">
  Options -Indexes
  Require all granted
  ErrorDocument 403 /batulabe/index.php

</Directory>

<Directory "/opt/lampp/htdocs/batulabe/private">
  <LimitExcept POST>
    Require all denied
  </LimitExcept>
</Directory>

为了保存重新启动Apache的时间,我的重写被临时写入.htaccess(它存储在网站根文件夹“/batulabe”中)。

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule ^(.*)$ public/pages/$1.php [R=301,L]
</IfModule>

标志[R=301]帮助我了解了为什么(可能吧?)到目前为止,以前的重写组合都没有起作用,这是因为^导致http://my_ipv4_address/opt/lampp/htdocs/batulabe/而不是http://my_ipv4_address/batulabe/,或者至少没有网站文件夹“/batulabe”,因为所有内容都是安装时的默认值。
任何帮助都将不胜感激!

h43kikqp

h43kikqp1#

为什么要使用R=301标志实现外部重定向?这 * 不是 * 您想要的,您想要的是 * 内部重写 *。因此,请删除该标志!
同样,RewriteCond也没有什么意义。您测试 requested 路径是否指向文件系统中的物理文件。但考虑到您希望将请求重写到其他文件夹,这很可能不是 * 情况。相反,您必须检查重写后的路径是否指向文件。
在您发布的代码片段中,实际的DOCUMENT_ROOT文件夹在配置中的定义位置存在一些差异。您在不同的文件中使用了不同的路径:/opt/lampp/apache2//opt/lampp/apache2/htdocs//opt/lampp/htdocs/...解决这个问题。它只是其中之一。
最后,您应该将分布式配置文件(“.htaccess”)放置在http主机的实际DOCUMENT_ROOT文件夹中。请在您的配置中检查这一点。原因是您希望稍后将该规则移动到http服务器的主机配置中(这是我从您的措辞“我的重写被临时写入”中所理解的...
这是一种可以为您指明正确方向的方法:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/batulabe/public/pages/
RewriteRule ^/?batulabe/(.*)$ /batulabe/public/pages/$1.php [L]

一般来说,你应该更喜欢把这些规则放在实际的http服务器的主机配置中,而不是使用分布式配置文件。原因之一是为了避免增加复杂性和对不同路径处理的混淆。
当然,也可以像您一样,在存储在层次结构更低的文件夹中的配置文件中实现规则。

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/pages/
RewriteRule ^(.*)$ public/pages/$1.php [END]

但请注意,当将这些规则移到中央配置时,您必须再次更改它们。而且,您可能会与您在层次结构中某处实现的 * 其他 * 规则发生更多意外交互。这就是为什么根据我的经验,通常应避免使用这种方案。

相关问题