1

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

4

1 回答 1

1

看起来该index.php文件不在您的文档根目录中(我假设是www),因此,我认为您无法从 .htaccess 文件中执行此操作。为了访问文档根目录之外的内容,您需要在服务器配置或虚拟主机配置中设置别名:

# 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现在您可以通过URI 访问index.php/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$更合适的内容。这仅匹配以 a 结尾的任何内容.php,包括/blah/bleh/foo/bar/somethingsomething.php. 如果要限制目录深度,可以将正则表达式调整为^([^/]+)\.php$等。

于 2012-07-10T16:28:40.730 回答