Điểm:1

.htaccess Xóa tham số url php đầu tiên nếu tồn tại thứ hai

lá cờ cn

Đây là mã .htaccess của tôi:

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

*trong đó $1 = hồ sơ và $3 = john-smith

Điều này hoạt động tốt khi viết lại như https://example.com/profile/john-smith nhưng tôi cần một quy tắc viết lại thứ hai như https://example.com/john-smith chỉ khi tham số thứ hai chứa john-smith tồn tại.

Cảm ơn bạn!

CẬP NHẬT: (Toàn bộ quy tắc của tệp .htaccess của tôi)

# bảo vệ các tệp bắt đầu bằng .
RewriteRule /\.(.*) - [NC,F]

# chuyển hướng HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

# Không có quyền truy cập root mà không có chỉ mục.* và bảo mật khác
Viết LạiEngine Trên
Tùy chọn Tất cả -Chỉ mục
viết lại cơ sở /
Directory Index index.php index.html index.htm
ErrorDocument 404 https://example.com/pages.php?PAGE=404

# Ngăn tải lên các tệp PHP độc hại
<FilesMatch â\.(php|php\.)$â> 
Đặt hàng Cho phép, Từ chối 
Tư chôi tât cả 
</FilesMatch>

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
Quy tắc viết lại ^(.*)$ $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]
lá cờ kz
Bạn có thể vui lòng giải thích bằng ngôn ngữ tự nhiên chính xác những gì bạn đang cố gắng làm không. I E. Các URL đang được yêu cầu và các URL mục tiêu dự kiến? Không có "tham số URL" trong hai URL mẫu mà bạn đã nêu ("tham số URL" chỉ có trong URL được viết lại thành). "Tôi cần quy tắc viết lại thứ hai như `https://example.com/john-smith` chỉ khi tham số thứ hai chứa john-smith tồn tại" - Không có "tham số thứ 2" trong URL đó, chỉ có một _path phân khúc_ `john-smith`?
Adrian avatar
lá cờ cn
Cấu trúc url ban đầu trước mã htaccess của tôi trông như thế này: https://example.com/pages.php?PAGE=profile&LINK=john-smith. Điều duy nhất tôi cần làm ngay bây giờ là xóa tham số đầu tiên (PAGE=profile) khi tồn tại thứ hai, bởi vì tôi gặp tình huống khi chỉ tồn tại tham số đầu tiên.
lá cờ kz
Vì vậy, khi một yêu cầu đến với `example.com/john-smith` (nghĩa là chỉ một đoạn đường dẫn và không có dấu gạch chéo ở cuối), nó nên viết lại yêu cầu thành `/pages.php?LINK=john-smith`?
Adrian avatar
lá cờ cn
Đúng chính xác...
Điểm:0
lá cờ kz
RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

"Vấn đề" với điều này là nó cũng sẽ khớp với yêu cầu cho /John Smith (nhóm thứ 2 là tùy chọn), nhưng viết lại yêu cầu thành pages.php?PAGE=john-smith&LINK=, thay vì pages.php?LINK=john-smith theo yêu cầu. Đối với điều này, bạn sẽ cần một quy tắc riêng. Nó cũng phù hợp /profile/john-smith/bất cứ thứ gì, loại bỏ /bất cứ điều gì nhưng vẫn viết lại yêu cầu (mối quan hệ nhiều với một) có khả năng mở trang web của bạn cho những kẻ gửi thư rác.

Giả sử bạn không cho phép dấu chấm (.) trong các phân đoạn đường dẫn URL (theo ví dụ của bạn) thì không cần kiểm tra xem yêu cầu có ánh xạ tới tệp hay không. ví dụ. một yêu cầu cho /hồ sơ/john-smith không bao giờ có thể ánh xạ tới tệp nếu tất cả các tệp của bạn đều có phần mở rộng tệp, vì vậy việc kiểm tra hệ thống tệp là không cần thiết.

Thay vào đó, hãy thử những cách sau:

# Viết lại chính xác một đoạn đường dẫn
# ví dụ. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]

# Viết lại chính xác hai đoạn đường dẫn
# ví dụ. /profile/john-smith tới pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]

Các NC cờ trên trước viết lạiđiều kiện chỉ thị có lẽ là dư thừa.

([^/.]+) - Tôi đã thay đổi mô hình con chụp để loại trừ các dấu chấm. Và quy tắc thứ hai khớp chính xác hai đoạn đường dẫn, không phải một hoặc hai đoạn đường dẫn, như trong ví dụ của bạn.

Adrian avatar
lá cờ cn
Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Thật không may, giải pháp của bạn không hiệu quả với trường hợp của tôi... Mã "phân đoạn hai phần" chỉ hoạt động nếu tôi thay đổi $ bằng ? và không có dấu chấm. "Phân khúc một phần" hoàn toàn không hoạt động.
lá cờ kz
@Adrian Ý bạn là gì khi "không hoạt động"? Điều gì xảy ra chính xác? Bạn có mắc lỗi gì không? Bạn thấy phản ứng gì? Nếu "phân đoạn hai phần" chỉ hoạt động nếu bạn thay đổi nó thì nó sẽ khớp với một thứ gì đó khác với các URL ví dụ như đã nêu. Bạn có lệnh nào khác trong tệp `.htaccess` này? Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm tệp `.htaccess` hoàn chỉnh của bạn với các lệnh này - bạn có thể gặp xung đột. Và tập tin `.htaccess` này nằm ở đâu? Bạn có bất kỳ tệp `.htaccess` nào khác không?
Adrian avatar
lá cờ cn
Tôi vừa cập nhật câu hỏi của mình với các quy tắc hoàn chỉnh của tệp .htaccess. Vì vậy, tệp htaccess nằm trên cùng thư mục với pages.php và đó là tệp duy nhất tôi có. Đó không phải là một lỗi cụ thể đối với quy tắc "một phần phân đoạn". Trên thực tế, kết quả trông giống như một trang bị mất với một số đoạn đầu trang và chân trang của tôi, không hiển thị đúng nội dung khi nó tải khi tôi truy cập mà không viết lại url.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.