お世話になります。

現在管理しているサイトは、  
例えば `http://example.com/files/content`  
というリクエストに対し、.htaccessにて、

```

    RewriteRule ^files/([0-9A-Za-z_)]+)$ $1.php [QSA,L]
    
```

という形で、  
content.phpを表示するようにしています。

しかし、現在の設定では、  
`http://example.com/content.php`  
でアクセスしても、同じファイルが表示されます。  
apacheのアクセスログを見ますと、botなのか、直接
.phpで終わるリクエストのログが時々見られるため、できれば指定したphpファイル以外は、指定したURL以外の方法では開けないようにしたいと思っています。

例えば、a.phpとb.phpを許可するファイルとして、  
`http://example.com/a.php`  
`http://example.com/b.php`  
でリクエストしても開けるが、  
その他の`http://example.com/content.php`というような「.php」を含むリクエスト対して、error.htmlを表示させたいと思い、

```

    RewriteRule ^files/([0-9A-Za-z_)]+)$ $1.php [QSA,L]
    RewriteCond %{REQUEST_URI} !a.php$
    RewriteCond %{REQUEST_URI} !b.php$ 
    RewriteRule ^([0-9A-Za-z_)]+).php$ error.html [L]
    
```

このようにしたところ、  
a.php、b.phpでは開くことが出来ますが、  
肝心の  
`http://example.com/files/content`  
でもerror.htmlが表示されるようになってしまいます。

どのように書けばよいか、ご助言をお願い致します。  
よろしくお願いします。
CC BY-SA 3.0
2015-07-09T01:54:59.883
12176
2015-07-09T08:47:31.390
7702
question
php 正規表現 .htaccess
[mod_rewrite]指定したファイル以外は「.php」でアクセスしても開けないようにしたい。
L|last フラグは httpd.conf で設定した場合はそこで停止しますが、.htaccess で設定した場合は書き換え後の URL
がもう一度、最初のルールから解析されるようです。

[RewriteRule
Flags:L|last](http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l)

Apache httpd 2.4 の場合は [L] の代わりに [END] を利用することができます。

[RewriteRule
Flags:END](http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_end)

Apache httpd 2.2 以前の場合は httpd.conf に設定するしかないと思います。
CC BY-SA 3.0
2015-07-09T08:47:31.390
12200
2015-07-09T08:47:31.390
4603
12176
answer