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へのシンボリックリンクです。

私はこの配置がばかげていると思い、シンボリックリンクを取り除き、ページが実際にindex.phpにリダイレクトされることなく、/ www/*。phpリクエストがindex.phpを指すようにしたいだけです。

この問題を解決できるhtaccessルールのアイデアはありますか?最も基本的なコアでは、1000個のシンボリックリンクされたファイルがなくても同じ機能を維持したいと思います。

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または)を作成しない限り安全であることに注意してください。URIを介してindex.phpScriptAliasにアクセスできるようになったので、ドキュメントルート(www)の.htaccessファイルにいくつかのmod_rewriteルールを設定して、index.phpを指すようにすることができます。/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$などに微調整できます。

于 2012-07-10T16:28:40.730 に答える