1

独自のカスタム CMS を使用して、サーバー上のクリーンな URL に .htaccess スクリプトを使用しています。

# this is the initialization
Options         +FollowSymLinks
RewriteEngine   On
RewriteBase     /
# these are the rewrite conditions
RewriteCond     %{REQUEST_FILENAME}     !-f
RewriteCond     %{REQUEST_FILENAME}     !-d
# and finally, the rewrite rules
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$   /pages.php?which_page=$1&data1=$2 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]
RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

これは、すべてのリクエストを CMS の pages.php スクリプトにリダイレクトするのに最適です。

問題は、まれに、サブディレクトリを追加したいクライアントがいて、そこにサブディレクトリを無制限に追加できることです。サブディレクトリはすべて、その中の index.html にリダイレクトする必要があります。この議論では、ユーザーがwww.mysite.com/main-dirにアクセスしたときに、このプライマリ サブディレクトリを main-dir にリダイレクトする必要があります。www.mysite.com/main-dir/index.html

クライアントが main-dir にさらにディレクトリを追加する場合、方向はその中の index.html にする必要があります。www.mysite.com/main-dir/some-dir/index.html

したがって、基本的に、main-dir とそのサブディレクトリのいずれかを通常の pages.php リダイレクトから除外し、それらがすべてそれらの中でリダイレクトされるようにする必要がindex.htmlあります。

RewriteEngine offサブディレクトリに .htaccess ファイルを追加するだけで、次のようなさまざまな条件とルールを追加するなど、これを達成するために多くのことを試しました。

RewriteCond %{REQUEST_URI} !^/collections/^

RewriteRule ^(collections)/$1 [L]

何も機能していません。

現在、Web ユーザーがwww.mysite.com/main-dirアクセスすると、pages.php スクリプトにリダイレクトされ、除外されませんが、アクセスするwww.mysite.com/main-dir/index.htmlと HTML ページにアクセスします。

任意の支援をいただければ幸いです。

4

2 に答える 2

3

次のように、すべてのRewriteRuleでネガティブ先読みを利用する必要があります。

# ignore all rules if URI starts with /main-dir/
RewriteRule ^main-dir/  - [L,NC]

RewriteRule ^([\w\s+-]+)/?$ pages.php?which_page=$1 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]

RewriteRule ^([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/([\w\s+-]+)/?$ pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

これにより、上記のルールがを除く /main-dir/すべてに適用可能になります。

また、Apacheではデフォルトで表示されるため、index.html内部でサービスを提供/main-dir/する場合は何もする必要はありません。

于 2012-01-11T18:53:47.653 に答える
0

htaccess の先頭に以下を追加するだけです。これにより、URL が pages.php に書き換えられるのを防ぐことができます。URL の最初の部分は、ルートにある既存のディレクトリです。したがって、xxx​​ という名前のディレクトリが存在する場合、example.com/xxx/whatever/ は書き換えられません。

RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^([^/]+)(/(.*))?$ - [L]

RewriteCond は問題ないように見えましたが、すべての RewriteRule の前で繰り返す必要がありました。他の 2 つ (... !-dおよび... !-f) についても同様です。しかし、以下で使用する方法をお勧めします。そのため、何度も繰り返す必要はありません。

最終的に、htaccess は次のようになります。

# this is the initialization
Options         +FollowSymLinks
RewriteEngine   On
RewriteBase     /
# don't rewrite if any of these conditions 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* - [L]

RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^([^/]+)(/(.*))?$ - [L]


# Rewrite all other matching urls to pages.php

#leave old rewrite rules (without the conditions) here, or use the much sorter version I would suggest.
RewriteRule     ^([^/]+)(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]

#old rules
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$   /pages.php?which_page=$1&data1=$2 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6 [L,QSA]
#RewriteRule     ^([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/([a-zA-Z0-9\-\_\ \+\-]+)/?$    /pages.php?which_page=$1&data1=$2&data2=$3&data3=$4&data4=$5&data5=$6&data6=$7 [L,QSA]
于 2012-01-11T19:26:44.887 に答える