Isu peraturan tulis semula .htaccess
P粉316890884
P粉316890884 2024-03-20 00:01:01
0
1
320

.htaccess Terdapat masalah dengan peraturan menulis semula. Hantar URL daripada e-mel pengguna kepada penyemak imbas yang mengandungi token untuk penetapan semula kata laluan.

Semasa .htaccess Peraturan:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.DOMAIN\.com [NC]
RewriteRule ^(.*)$ https://DOMIAN.com/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ .php [L]

RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC]
RewriteRule ^(.*)\.php$  [R=301,L]

Apabila pengguna cuba pergi

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

Menghasilkan ralat ini dalam penyahpepijatan

example.com/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6.php.php.php.php.php.php.php.php.php.php

Jadi saya mengikuti komen di bawah dan mengemas kini .htaccess seperti berikut:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.EXAMPLE\.com [NC]
RewriteRule ^(.*)$ https://EXAMPLE.com/ [L,R=301]

RewriteCond %{THE_REQUEST} ^(?:GET|POST)\ /.*\.php\ HTTP.*$ [NC]
RewriteRule ^(.*)\.php$  [R=301,L]

# Rewrite extensionless ".php" URLs
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule (.+) .php [L]

# Rewrite "/<file>/<code>" to "/<file>.php/<code>"
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^([^/]+)/([a-f0-9])$ .php/ [L]

Saya mendapat ralat berikut:

AH00128: Fail tidak wujud: /var/www/html/htdocs/activate/00803e6632236414ebcdc34c7e7690d764e567083fac6

P粉316890884
P粉316890884

membalas semua(1)
P粉651109397

Masalah dengan peraturan ini ialah anda sedang menyemak laluan sistem fail (iaitu %{REQUEST_FILENAME}.php)并重写到另一个文件系统路径(.php)。这些不一定指同一件事。对于对 /activate/foo 的请求,其中 activate 不是文件系统目录,则 REQUEST_FILENAME 的格式为 /var/www/html/htdocs/activate (因此文件检查成功,因为 /var/www/html/ htdocs/activate.php 存在),但它将请求重写为 activate/foo.php (使用 反向引用) - 该请求不存在。它将重复执行此操作,每次附加 .php (sehingga had penulisan semula dalaman dicapai; lalai 10).

Selain #1: Tidak perlu menyemak sama ada permintaan dipetakan ke direktori dan bukan ke fail sebelum menyemak sama ada request+.php dipetakan ke fail. Itulah 3 (mahal) semakan sistem fail apabila hanya satu yang diperlukan.

Selain #2: Anda juga tidak perlu menyerlah ke belakang untuk melarikan diri dari titik literal dalam TestString (argumen pertama), kerana ini adalah rentetan "biasa", bukan regex.

Peraturan ini perlu diperbetulkan supaya anda menguji laluan fail yang sama yang akhirnya anda tulis semula. Contohnya:

# Rewrite extensionless ".php" URLs
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule (.+) .php [L]

Anda kemudian memerlukan peraturan tambahan untuk lulus permintaan /activate/ 重写为 /activate.php/ (将 / sebagai maklumat laluan ke skrip anda). Jika ini sekali sahaja, ini mungkin "berkod keras". Contohnya:

# Rewrite "/activate/" to "/activate.php/"
RewriteRule ^(activate)/([a-f0-9]+)$ .php/ [L]

(Saya mengandaikan ialah jujukan heksadesimal, yang nampaknya berlaku dalam contoh anda.)

Atau jika anda mempunyai permintaan yang serupa, jadikan ia lebih generik. Sebagai contoh. /<文件>//<文件>.php/. Contohnya:

# Rewrite "//" to "/.php/"
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule ^([^/]+)/([a-f0-9]+)$ .php/ [L]

Riwayat:

Peraturan ini (ubah hala luaran) hendaklah mendahului penulisan semula di atas.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!