Rumah > Soal Jawab > teks badan
.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粉6511093972024-03-20 21:37:57
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.