我是新的整个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”,因为所有内容都是安装时的默认值。
任何帮助都将不胜感激!
1条答案
按热度按时间h43kikqp1#
为什么要使用
R=301
标志实现外部重定向?这 * 不是 * 您想要的,您想要的是 * 内部重写 *。因此,请删除该标志!同样,
RewriteCond
也没有什么意义。您测试 requested 路径是否指向文件系统中的物理文件。但考虑到您希望将请求重写到其他文件夹,这很可能不是 * 情况。相反,您必须检查重写后的路径是否指向文件。在您发布的代码片段中,实际的
DOCUMENT_ROOT
文件夹在配置中的定义位置存在一些差异。您在不同的文件中使用了不同的路径:/opt/lampp/apache2/
,/opt/lampp/apache2/htdocs/
,/opt/lampp/htdocs/
...解决这个问题。它只是其中之一。最后,您应该将分布式配置文件(“.htaccess”)放置在http主机的实际
DOCUMENT_ROOT
文件夹中。请在您的配置中检查这一点。原因是您希望稍后将该规则移动到http服务器的主机配置中(这是我从您的措辞“我的重写被临时写入”中所理解的...这是一种可以为您指明正确方向的方法:
一般来说,你应该更喜欢把这些规则放在实际的http服务器的主机配置中,而不是使用分布式配置文件。原因之一是为了避免增加复杂性和对不同路径处理的混淆。
当然,也可以像您一样,在存储在层次结构更低的文件夹中的配置文件中实现规则。
但请注意,当将这些规则移到中央配置时,您必须再次更改它们。而且,您可能会与您在层次结构中某处实现的 * 其他 * 规则发生更多意外交互。这就是为什么根据我的经验,通常应避免使用这种方案。