.htaccess 2 番目の PHP URL パラメータが存在する場合は最初のパラメータを削除します

.htaccess 2 番目の PHP URL パラメータが存在する場合は最初のパラメータを削除します

これは私の .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 つのパス セグメント。

関連情報