我正在研究这个遗留项目,它有一个相当奇怪的设置,我正在寻求摆脱,但我的htaccess技能在这个部门有点缺乏。
这是目录结构。
/index.php
/www
page1.php -> symlink to index.php
page2.php -> symlink to index.php
page3.php -> symlink to index.php
/ www是公共目录,人们访问http://site/page1.php
。但是,每个文件都带有*实际符号链接到/index.php。
我发现这种安排是愚蠢的,并且想要摆脱符号链接,只需要将任何/www/*.php请求简单地指向index.php,而不会将页面实际重定向到index.php。
有关可以解决此问题的htaccess规则的任何想法吗?在最基本的核心,我希望保持相同的功能,而不必拥有一千个符号链接文件。
答案 0 :(得分:1)
在您的文档根目录中看起来index.php
文件不是(我假设是www
),因此,我不会&# 39;不要认为你可以通过.htaccess文件执行此操作。要访问文档根目录之外的内容,您需要在服务器配置或vhost配置中设置别名:
# Somewhere in vhost/server config
Alias /index.php /var/www/path/to/index.php
# We need to make sure this path is allowed to be served by apache, otherwise
# you will always get "403 Forbidden" if you try to access "/index.php"
<Directory "/var/www/path/to">
Options None
Order allow,deny
Allow from all
</Directory>
现在您应该可以访问/var/www/path/to/index.php
了。请注意,/ var / www / path / to目录中的其他文件是安全的,只要您不创建指向Alias
(或AliasMatch
或ScriptAlias
)的文件他们。现在您可以通过/index.php
URI访问 index.php ,您可以在文档根目录(www)的.htaccess文件中设置一些mod_rewrite规则,以指向index.php:
# Turn on the rewrite engine
RewriteEngine On
# Only apply the rule to URI's that don't map to an existing file or directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all requests ending with ".php" to "/index.php"
RewriteRule ^(.*)\.php$ /index.php [L]
当您请求 http://site/page1.php 时,浏览器的地址栏会保持不变,但服务器实际上会提供/index.php
,别名为/var/www/path/to/index.php
。
如果需要,您可以将正则表达式^(.*)\.php$
调整为更合适的值。这只会匹配以.php
结尾的所有内容,包括/blah/bleh/foo/bar/somethingsomething.php
。如果要限制目录深度,可以将正则表达式调整为^([^/]+)\.php$
等。