3

私はUbuntu12.04をApache2.2.22とPHP5.3.10で実行しています。ユーザーが「.php」拡張子を入力せずに、大文字と小文字の区別を気にせずに、自分のサイトのページをリクエストできるようにしたいと思います。たとえば、次のようなURL ...

http://www.site.com/test/phpinfo
http://www.site.com/test/PhPiNfO

...両方が次のことにつながるはずです:

http://www.site.com/test/phpinfo.php

この質問で受け入れられた回答に従うことで、大文字と小文字を区別しないことから始めました。'/ etc / apache2 / sites-available/default'ファイルは次のようになります...

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www

        RewriteMap lc int:tolower

        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        <Directory /var/www/test>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

...そしてこれが私の.htaccessファイルです:

RewriteEngine On
RewriteRule ^([a-z]+)/([a-z\-]+)$ /${lc:$1}/${lc:$2}.php [L,NC]

ファイル拡張子の部分は機能していますが、何らかの理由で大文字と小文字の区別が引き続き適用されています。私のApacheエラーログは次のような行でいっぱいです:

[Sat Jan 05 23:10:41 2013] [error] [client 192.168.1.9] File does not exist: /var/www/test/phpinfO

私がここで間違っていることについて何か考えはありますか?

編集:数時間実験した後、私は最も奇妙な行動を見ています!.htaccessファイルが単に無視されているのではないかと思ったので、それをぎこちなく埋めました。これにより、予想どおり内部サーバーエラーが発生しました。次に、.htaccessファイルでこれらの2行だけを試しました...

RewriteEngine On
RewriteRule ^/(.*)$ /${lc:$1}

...そしてtest/phpinfO.phpにアクセスしようとしましたが失敗しました。次に、.htaccessファイルを削除し、これらの2行を「/ etc / apache2 / sites-available / default」ファイルに直接配置して、Apacheを再起動しました。なんらかの理由で、私が望んでいた動作が機能しています。私の唯一のルールはURLに「.php」を追加しないので、私はおそらくその方法を理解することはできません!

これは奇妙に聞こえるかもしれませんが、私の変更が少し遅れて有効になっているように感じます。すぐには機能しない他のテストをいくつか試しましたが、後で機能するはずのないときに機能するようでした。私はテストを続け、現在のセットアップが何も変更せずに壊れることを期待しています。いずれにせよ、私は絶対に困惑しています。

私が脳を引き裂いてスレッジハンマーで粉砕する前に、誰かがこれに光を当てることができることを願っています。

4

2 に答える 2

4

私はついにこれを理解しました。まあ、少なくともその一部です。「MultiViews」オプションは、「.php」拡張子のないファイルの解決に関与していたことが判明しました。これを、「/etc/apache2/sites-available/default」ファイルの次の 2 行と組み合わせることで、私が望む動作が得られます。

RewriteEngine On
RewriteRule ^/(.*)$ /${lc:$1}

残念ながら、.htaccess ファイルに上記のルールがある場合に無視される理由を特定できませんでしたが、意味不明なルールがある場合は無視されません。

編集: OK、.htaccess ファイルが機能しない理由がわかりました。読み取られていましたが、2 番目のルールが一致していませんでした。Apacheのドキュメントによると、その理由は次のとおりです。

削除されたプレフィックスは常にスラッシュで終わります。つまり、先頭にスラッシュがない文字列に対して照合が行われます。したがって、^/ を含むパターンは、ディレクトリごとのコンテキストでは決して一致しません。

その結果、.htaccess ファイルを次のように変更しました...

RewriteEngine On
RewriteRule ^(.*)$ ${lc:$1}

...そして、ついに機能します!

于 2013-01-06T15:15:27.867 に答える
0
CheckSpelling on

ファイルとディレクトリを照合します。詳細については、ドキュメントを参照してください。

コピー元= mod_rewriteで大文字と小文字を区別しないURL

于 2013-01-06T07:22:53.850 に答える