htaccess规则 - 取代符号链接文件的位置

时间:2012-07-10 15:57:33

标签: .htaccess

我正在研究这个遗留项目,它有一个相当奇怪的设置,我正在寻求摆脱,但我的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规则的任何想法吗?在最基本的核心,我希望保持相同的功能,而不必拥有一千个符号链接文件。

1 个答案:

答案 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(或AliasMatchScriptAlias)的文件他们。现在您可以通过/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$等。