これは私の .htaccess コードです:
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
*$1 = プロファイル、$3 = ジョン・スミス
これは次のように書き直すとうまくいきますhttps://example.com/profile/john-smithしかし、次のような2番目の書き換えルールが必要ですhttps://example.com/john-smithjohn-smith を含む 2 番目のパラメータが存在する場合のみ。
ありがとう!
更新: (私の .htaccess ファイルの完全なルール)
# protect files beginning with .
RewriteRule /\.(.*) - [NC,F]
# redirect HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
# No root access without index.* and other security
RewriteEngine On
Options All -Indexes
RewriteBase /
DirectoryIndex index.php index.html index.htm
ErrorDocument 404 https://example.com/pages.php?PAGE=404
# Prevent upload malicious PHP files
<FilesMatch “\.(php|php\.)$”>
Order Allow,Deny
Deny from all
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [QSA, L]
答え1
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
これの「問題」は、 のリクエストにも一致しますが/john-smith
(2 番目のグループはオプション)、要求どおりにpages.php?PAGE=john-smith&LINK=
ではなく にリクエストを書き換えてしまうことです。このためには別のルールが必要になります。 にも一致し、 を破棄しますが、リクエストは書き換えられます (多対 1 の関係)。これにより、サイトがスパマーに開かれる可能性があります。pages.php?LINK=john-smith
/profile/john-smith/anything
/anything
URL パス セグメントでドット ( ) を許可していないと仮定すると.
(例のように)、要求がファイルにマップされていないことを確認する必要はありません。たとえば、/profile/john-smith
すべてのファイルにファイル拡張子が付いている場合、 の要求はファイルにマップされないため、ファイル システム チェックは冗長です。
代わりに次のことを試してください。
# Rewrite exactly one path segment
# eg. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]
# Rewrite exactly two path segments
# eg. /profile/john-smith to pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]
NC
前のディレクティブのフラグはおそらくRewriteCond
冗長です。
([^/.]+)
- キャプチャサブパターンを変更してドットも除外しました。2番目のルールは1つのパスセグメントではなく、正確に2つのパスセグメントに一致します。または例のように、2 つのパス セグメント。