8

MultiViewsを有効にして、Clean-Urlsを許可しようとしています。

私が持っているすべてのページは、ルートフォルダ自体にあります。

私は次のことを達成しようとしています:

(current-status -> what I am trying to achieve)

 1. foo.com/services.php -> foo.com/services
 2. foo.com/services == foo.com/services/
 3. foo.com/services.php/second-level/ == foo.com/services/second-level

これservicesは フォルダではありません$_SERVER['PATH_INFO']。分解して第2レベルのパスデータを取得します。

MultiViews私はすでに最初のものを達成しましたが、ファイルを使用し.htaccessてリライトを書き込んで有効にすると失敗します。

Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]

(これは、リクエストをservices / second-level.phpに変更するため、明らかに失敗します)。で複数の書き換えを記述し.htaccess、条件付きでリダイレクトできることはわかっています。

しかし、奇妙な事実は、ライブ環境(共有ホスティング)では、ルートフォルダーにファイルがなくても機能していることです。.htaccess共有ホスティングなので、設定ファイルが読めません。

apache.conf上記を実現するために(またはで)どの構成を変更する必要があるかについてのアイデアは*.confありますか?

重要な場合は、を使用していApache/2.2.22ますが、この問題は更新後に発生し始めました。

4

3 に答える 3

12

私はついにそれを解決する方法を見つけました。

これは機能し、.htaccessファイルを完全に削除し、を変更しVirtual Directoryて次の設定を保持します。

<VirtualHost *:80>
    ServerAdmin my-email-id
    ServerName foo.bar
    DocumentRoot /var/www/sites/foo/

    <Directory /var/www/sites/foo/>
        Options +FollowSymLinks +MultiViews +Indexes
        DirectoryIndex index.php
        AddType application/x-httpd-php .php
    </Directory>

</VirtualHost>

これにより、すべてのページを、サーバーで動作していたのとまったく同じように、書き換え条件なしで動作させることができます。

于 2013-01-13T18:38:26.277 に答える
0

.php拡張子を使用せず、MultiViewsを使用せずにURLをクリーンアップします。

mod_userdirmod_rewriteを使用した仮想サブドメインサポートを備えた柔軟なWeb環境。

次のURLレイアウトを許可します

  • /var/www/sites/www/services.php
    • http://foo.bar/services.php/second-level/
    • http://foo.bar/services/second-level/
    • http://www.foo.bar/services/second-level/
    • http://127.0.0.1/services/second-level/
  • /var/www/sites/www/admin/login.php
    • http://foo.bar/admin/login.php/foo
    • http://foo.bar/admin/login/foo
    • http://www.foo.bar/admin/login/foo

wwwを前に付けるかどうかに注意してください。www。今日は廃止されました...しかし、フォルダを追加するだけで仮想サブドメインをホストできるようになりました/var/www/sites/(DNSを覚えておいてください)

  • /var/www/sites/images/imgpass.php
    • http://images.foo.bar/imgpass.php/photo.jpg
    • http://images.foo.bar/imgpass/photo.jpg
    • http://www.images.foo.bar/imgpass/photo.jpg
    • http://127.0.0.1/~images/imgpass/photo.jpg

...などですが、/ var / www / sites / images/imgpass自体が存在する場合はスキップします。

私は、すべてのユーザーが独自のWebルートとサブドメインを持っているマルチユーザー環境を使用しています。

/etc/apache2/sites-enabled/foo.bar.conf:

<VirtualHost *:80>
  ServerAdmin my-email-id
  ServerName foo.bar
  ServerAlias 127.0.0.1 *.foo.bar

  # The default web-root if no subdomain is given
  DocumentRoot /var/www/sites/www/

  UserDir /var/www/sites/*
  <Directory /var/www/sites/*>
            Order allow,deny
            Allow from all
            DirectoryIndex index.php index.html
            Options -MultiViews -Indexes

            # MultiViews workaround with 1 level subdir support
            RewriteEngine On

            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){2}).*
            RewriteCond %1.php -f
            RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){2})(.*) /~$1$2.php$3 [L]

            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){1}).*
            RewriteCond %1.php -f
            RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){1})(.*) /~$1$2.php$3 [L]
   </Directory>

   # Force all requests in background to UserDir compatible requests
   RewriteEngine on
   RewriteMap      lc                      int:tolower

   RewriteCond     %{REQUEST_FILENAME}     !^/~
   RewriteCond     %{HTTP_HOST}            ^(www\.)?(.+)\.foo\.bar$
   RewriteRule     /(.*)                   /~${lc:%2}/$1                   [PT,L]

</VirtualHost>

私のファイルシステム構造は最初の例とは完全に異なるため、このコードはtestetではありません。そこで、この例の構造に合うように、その場で構成を変換しました。

構成が不完全であることに注意してください。ニーズに合わせて自分で調整する必要があります。

于 2014-12-29T23:51:22.390 に答える
0

MultiViewsはこれに使用できますが、受け入れられた回答やインターネット上の他の多くのソースが示唆しているように、PHPファイルに任意のMIMEタイプを追加して、MultiViewsによって提供されるようにしないでください。

# Bad code - don't do this!
Options +MultiViews
AddType application/x-httpd-php .php

https://stackoverflow.com/a/24598848/1709587で詳細に説明しているこのハックは、機能しているように見えますが、実際には壊れています。Acceptサーバーがを含まないヘッダーを持つリクエストを受信するたびに失敗します*/*

代わりに、クリーンな解決策は、ディレクティブを使用して、リクエストのヘッダーとヘッダーに関係なくファイルMultiviewsMatchを提供することが有効であることをApacheに通知することです。.phpAcceptAccept-Language

# Good code - use this instead!
Options +MultiViews
<Files "*.php">
    MultiviewsMatch Any
</Files>
于 2017-01-22T16:40:19.707 に答える