0

htaccess ファイルに次のコードがあります。

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /%1?%2 [L,R=301]

#remove file extensions
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]


ErrorDocument 400 /404.php
ErrorDocument 401 /404.php
ErrorDocument 403 /404.php
ErrorDocument 404 /404.php 
ErrorDocument 500 /404.php

<Files .htaccess>
order allow,deny
deny from all
</Files>

バニティ URL に関しては問題なく動作しますが、URL の末尾にあるphp 拡張子を削除するとうまくいきません:

1.と入力するmysite.com/home.phpと にリダイレクトされますhome.phpが、拡張機能はアドレス バーに表示されたままです。

2.を入力mysite.com/homeすると、カスタム エラー ページにリダイレクトされhomeます。ユーザー名がデータベースではないためです。

1. と 2. を修正するにはどうすればよいですか?

4

1 に答える 1

1

ユーザー名ルーティングの前に、php 拡張子チェックを行う必要があります。もちろん、ユーザー名と同じ php ファイルがあった場合、これは壊れます。すべてのユーザー名にプレフィックスを付けない限り、これを回避する方法はありません。

したがって、ルールを入れ替えて、php ファイルへの直接アクセスをリダイレクトする別のルールを追加します。

# we don't want to mess with /profile.php access because there's a rule later that deals with that
RewriteCond %{REQUEST_URI} !^/profile\.php
RewriteCond %{THE_REQUEST} \ /(.*)\.php(\?|\ |$)
RewriteRule ^ /%1 [L,R=301]

# add file extensions back to URI
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /%1?%2 [L,R=301]

ユーザーのプレフィックスとは、次のようなものです。

http://mysite.com/u/foobar

ここで、/u/は「foobar」がユーザーであり、php ページではないことを示しています。これを行うには、「# バニティ URL」セクションにいくつかの変更を加える必要があります。

#vanity URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^u/([a-zA-Z0-9-_]*)$ /profile.php?username=$1 [L,QSA]
RewriteCond %{THE_REQUEST} \ /profile\.php\?username=([^&\ ]+)&?([^\ ]*)
RewriteRule ^ /u/%1?%2 [L,R=301]

/u/基本的に、マッチとリダイレクトの一部として含めます。

于 2013-10-02T22:01:21.800 に答える