1

mod_rewriteに奇妙な問題があります。

のようなURI/newsは、存在するため正しく一致しnews.phpます。ただし、/news/1900-01-01/titleあたかも一致するかのように/news

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_URI} !/$ #workaround for URIs ending in a slash passing the previous check
RewriteRule ^(.*)$ debug.php?page=$1.php&req_filename=%{REQUEST_FILENAME}&req_uri=%{REQUEST_URI} [L]

それを使用して実行すると/news、期待される結果が得られます。

page=/news.php
req_filename=/home/domain/public_html/news
req_uri=/news

/news/1900-01-01/titleそれと一緒に実行すると、次のようになります。

page=/news/1900-01-01/title.php
req_filename=/home/domain/public_html/news
req_uri=/news/1900-01-01/title

なぜ%{REQUEST_FILENAME}両方が同じなのですか?

ニュースアイテムの回避策はすでにあります。RewriteRule ^news/([0-9]{4}-[0-9]{2}-[0-9]{2})/([a-zA-Z0-9\-]+)$ news-item.php?date=$1&title=$2 [L]このスニペットの上に移動しました。ただし、2つの一意のURIが同じ存在しない(スクリプトが.phpを追加する)ファイルにどのように解決できるかを理解したいと思います。

4

1 に答える 1

1

Apacheは、最下位の「実際の」ディレクトリを見つけようとし、そのディレクトリに対応するディレクティブ(.htaccessやその他のディレクトリ固有のディレクティブなど)を処理します。あなたの場合、URIは実際のディレクトリに対応していないと思います。次に、Apacheはコンテンツネゴシエーションを使用し、マルチビューが設定されている場合(あなたの場合はそうだと思います)、ファイル名に基づいて最適なものを見つけます。あなたはnews.phpを持っているので、それが一致します。詳細を知りたい場合は、コンテントネゴシエーションとマルチビューのキーワードを説明するページを検索できます。

于 2012-05-22T16:52:02.767 に答える